String -> Variablenname

foerster7891

Aktives Mitglied
Hi,

ich habe eine Liste aus Variablen mit ähnlichen Namen:

Java:
int x1,x2,x3,x4;

bekomme z.B. einen Integerwert übergeben und möchte entsprechend daraus den Variablennamen generieren:

Java:
("x" + 2) = 5;

... und nein in meinem Fall ist es nicht einfacher mit z.B. einem Array lösbar.

Könnte mir jemand die Funktion/Klasse geben, die entsprechendes zu tun vermag?

Danke schonmal! (ich habs leider selber mit google nicht gefunden)
 
Ne einfache Map nutzen: Map<Integer, Integer>
Die Nummer abgebildet auf den Wert. dann brauchst du deine einzelnen x_i s nicht mehr.
 
der Name der Variablen ist aber eine id aus einer fxml

Deshalb kann ich es nicht alternativ lösen. Bzw. ich könnte einen switch einfügen, will ich aber eigentlich nicht.
 
Zuletzt bearbeitet:
Dann machst du eben eine Map<String,Integer>. Mir erscheint dein Problem eher komisch. Obgleich wir die selbe Problematik schon mehrmals im Forum hatte, gab es bis jetzt mir nicht einen bekannten Fall, wo es wirklich notwendig war auf Reflection zuzugreifen um sein ein Problem zu lösen. Es war eigentlich immer schön und elegant lösbar.
 
Java ist keine Scriptsprache. Zur Laufzeit gibt es gar keine Variablennamen mehr, deshalb kannst du auch nicht ohne Fallunterscheidungen dynamisch auf eine Variable zugreifen.
 
Java:
@FXML
private ImageView rightImg1;
@FXML
private ImageView rightImg2;
@FXML
private ImageView rightImg3;

@Override
	public boolean setTrainCard(int card) {
		for (int i = 0; i < 0; i++) {
			if (openCards[i] == 0) {
				openCards[i] = card;
				Image image = new Image(
						MainApp.class.getResourceAsStream("images/train" + card
								+ ".png"));
				("rightImg" + i).setImage(image);//<- Problem
				return true;
			}
		}
		return false;
	}

die entsprechende alternative, die ich allerdings nicht wählen möchte wäre ein switch.

Könntet ihr ohne über die Probleme einer entsprechenden Variante zu reden mir sagen, wie ich entsprechendes Problem auf gesuchtem Weg löse?
 
Zuletzt bearbeitet:
Einfaches Beispiel:
Java:
Map<Integer, ImageView> viewMap = new Hashmap<Integer, ImageView>();

for (int i = 0; i < 10; i++ )
  viewMap.put(i,new ViewMap()); // pack die ImageViews in die Map

ImageView x0 = viewMap.get(0);
//...
ImageView x3 = viewMap.get(3);
 
Zuletzt bearbeitet:
1. dein [c]new Image(...[/c] funktioniert nicht.
2. ImageView hat keine Methode [c]setImage(Image image)[/c]

Lösen lässt es sich aber per Reflection:

Java:
	private ImageView rightImg1;
	private ImageView rightImg2;
	private ImageView rightImg3;
	private int[] openCards;

	public boolean setTrainCard(int card) {
		for (int i = 0; i < 0; i++) {
			if (openCards[i] == 0) {
				openCards[i] = card;
				Image image = ImageIO.read(Thread.currentThread().getContextClassLoader().
						getResourceAsStream("images/train" + card + ".png"));
				getFieldByName(ImageView.class, "rightImg" + i).setImage(image);
				return true;
			}
		}
		return false;

	}

	@SuppressWarnings("unchecked")
	private <T extends Object> T getFieldByName(Class<T> type, String name) {
		try {
			return (T) getClass().getField(name).get(this);
		} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
			e.printStackTrace();
			return null;
		}
	}

Diese Lösung ist aber wirklich nicht schön gelöst.
 

Zurück
Oben