Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich versuche gerade erfolglos herauszufinden, ob und wie es möglich ist, den Namen eines boolean auszugeben und nicht nur true bzw. false.
Beispiel:
Java:
for (boolean wert : ende) {
if (wert) {
String name = new Boolean(wert).toString(); //das schreibt ja nur true rein, soll aber den Variablennamen schreiben, weil ich den dann weiter übergeben muss
}
}
boolean eins = true; boolean zwei = false;
wert = new boolean[] {eins, zwei};
for (boolean wert : ende) {
if (wert) {
String name = ... // da soll dann z.B. in name "eins" stehen, weil genau das dann wieder für anderes benutzt wird, was ja auch klappt, sofern ich den da hin bekomme
}
}
Das klingt mir ganz danach, als würdest du irgendwelche Properties (Einstellungen) speichern und ausgeben wollen. Wenn ja, dann könnte dir eine Map weiterhelfen. Da kannst du dann auch im Programm die Properties einfach abfragen.
boolean eins = true; boolean zwei = false;
wert = new boolean[] {eins, zwei};
for (boolean wert : ende) {
if (wert) {
String name = ... // da soll dann z.B. in name "eins" stehen, weil genau das dann wieder für anderes benutzt wird, was ja auch klappt, sofern ich den da hin bekomme
}
}
dir geht es sicher darum raus zubekommen ob jetzt der erst oder der zweite Wert auf true gesetzt wurde oder?
Versuch es mal hiermit.
Java:
boolean eins = true; boolean zwei = false;
wert = new boolean[] {eins, zwei};
for (int i = 0;i<wert.length;i++) {
boolean value = wert[i];
if (value) {
System.out.println("Treffer bei Index: "+(i+1));
}
}
... ausser, dass du statt [c]i[/c] fälschlicherweise [c](i+1)[/c] ausgibst. Anders würde es aussehen, wenn du [c](i + 1) + ". Element"[/c] ausgeben würdest.
(i+1) war schon absichtlich so gewählt damit er nicht drüber Stolpert das das erste Element den Index 0 hat, ich werde mich bessern und nie wieder das Wort Index benutzen .
nrg, aber [c]Element mit Index 0[/c] entspricht nunmal dem [c]1. Element[/c]
Stell dir vor, du würdest von einem User die Fehlermeldung "some Problem xy [Index 45]" kriegen, aber es würde das Element mit Index 44 betreffen. Würdest du dich da nicht aufregen? Sonst suchst du zuerst minutenlang am falschen Ort...
for (boolean wert : ende) {
if (wert) {
String string = ... //hier bräuchte ich jetzt den Variablennamen als String
if (ziel.equals("bEins")) {
bEins.setIcon(getImage(string));
if (lEins.getActionCommand().equals(string + "1")) {
lEins.setIcon(nothing);
} else if (lZwei.getActionCommand().equals(string + "1")){
lZwei.setIcon(nothing);
} else if (lDrei.getActionCommand().equals(string + "1")){
lDrei.setIcon(nothing);
} else if (lVier.getActionCommand().equals(string + "1")){
lVier.setIcon(nothing);
} else if (lFünf.getActionCommand().equals(string + "1")){
lFünf.setIcon(nothing);
}
neu = ziel;
bEins.setName(string);
bEins.setActionCommand(string + "1");
lEins.removeActionListener(this);
bEins.removeActionListener(this);
}
}
}
Wie man sieht, baut so ziemlich alles auf den gleichen Namen auf bzw. werden darüber zugewiesen. Daher wollte ich das nun so machen, um entsprechend dem true-Wert (sind später mehr boolean, aber nur einer ist true) verschiedenes zu ändern.
Ich versteh das nicht.. du musst unbedingt dein Konzept überdenken. Wie oben bereits geschrieben haben die Variablen für den Computer keinen Namen.. du kannst natürlich ein Array/Map mit Strings noch nebenbei erstellen, sodass du immer den String passend zu dem boolean speichert. Sinn dahinter wage ich zu bezweifeln^^
verstehe den sinn zwar selbst auch nicht ... aber wenn man GANZ WEIT ausholt könnte man was über reflections basteln ... aber ob das so seinen sinn hat wage ich auch zu bezweifeln ...
würde TO hier auch eine grundlegende überarbeitung seines konzeptes empfehlen
Sinnvoll oder nicht, es soll funktionieren, nichts anderes ist als Einsteiger wichtig.
Mit der Map klappt es sehr gut, danke dafür. Was mich jetzt noch beschäftigt, ist, wie ich den abgefragten Boolean aus der Map heraus auf false/true setzen kann.
Java:
map.get(wert) = false;
Das funktioniert ja dummerweise nicht. Ich kann natürlich am Ende der Aktionen alle möglichen Boolean manuell auf false setzen, aber das könnte ich auch mit allem anderen tun und das bringt´s ja nicht wirklich.
du müsstest schon wieder map.put() aufrufen,
oder als Value in der Map ein veränderlichers Objekt speichern, z.B. boolean[1], dann ginge
> map.get(wert)[0] = false;
Könnte man sich nicht ein eigenes Object schreiben?
Java:
public class NamedBoolean{
private final Sring name;
private boolean value;
public NamedBoolean(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setV...
@Override
public String toString(){
return NamedBoolean.class.getName()+"["+name+", "+value+"]";
}
...
bygones, wenn du dann aber Zugriff in [c]O(1)[/c] auf den Key haben willst (weil es eben irgendwelche Prefs o.ä. sind), dann musst du schlussendlich auch wieder eine [c]Map<String, NamedBoolean>[/c], oder besser [c]Map<T, NamedBoolean<T>>[/c], verwalten...
Man muss beim Coden nicht gross auf die Performance schauen. Aber dass man Collections mit den entsprechenden Vorteilen verwendet, ist nicht zu viel verlangt, oder ?
Ne Collection ist schon mal was feines für sowas. Klar kann man eine eigene Klasse schreiben für die Properties aber in einem solchen Fall ist es vielleicht ja eine Option die Klasse Properties zu nutzen. Java is ja nich blöde. Gibts doch alles schon.
Und nur zur Vollständigkeit und der Korrektheit zuliebe. Natürlich ist es möglich sich den Namen einer Variablen ausgeben zu lassen. Geht nicht gibt's nicht.
Ich würde aber lieber ein Array als eine Map benutzen.
Warscheinlich einfach weil mir Strings als key zuwider sind.
Ich benutze bei sowas lieber Integer. und dann könnte man auch eine Array nehmen.
Ich Programmiere zwar auch noch nicht so lange aber bei mir würde das so aussehen:
Code:
NamedBoolean nBoolean = new NamedBoolean[x];
Hat die verwendung einer Map<K,O> irgendwelche vorteile die ich nich (er)kenne?
Und nur zur Vollständigkeit und der Korrektheit zuliebe. Natürlich ist es möglich sich den Namen einer Variablen ausgeben zu lassen. Geht nicht gibt's nicht.
@Voltaire81: [c]Properties[/c] ist eine Kindklasse von [c]Hashtable[/c] Allerdings sind dort IMHO alle Keys und Values Strings, da müsste man ein Bisschen etwas überschreiben.
@Alle besetzt: Klar, statt [c]"app.update.cert.requireBuiltIn"[/c] (ein Property als Beispiel von Firefox) würdest du lieber [c]634[/c] nehmen? Viel Spass
@Voltaire81: [c]Properties[/c] ist eine Kindklasse von [c]Hashtable[/c] Allerdings sind dort IMHO alle Keys und Values Strings, da müsste man ein Bisschen etwas überschreiben.
Ist mir bewusst, danke. Es ging mir bei dem Vorschlag auch weniger um die zusätzliche Funktionalität (der Fall hier ist trivial) sondern das Anwenden des richtigen Konstrukts... Ich bin nun seit 10 Jahren unterwegs als IT-Consultant und bereinige ganz üblen Code. Dieses 'reinviting the wheel' ist dabei eines der häufigsten Probleme...
Sorry, gerade übersehen...
Was das für einen Sinn macht lässt sich so ad hoc nicht sagen. Ich hatte Anwendungsfälle. Da ging es aber eher um das Ermitteln von Methoden-Namen... In dem konkreten Fall hier keine....
Die 'geheimnisVolleVariablenNamenAusgebeFunction' :
Java:
void geheimnisVolleVariablenNamenAusgebeFunction(){
Field[] f = this.getClass().getDeclaredFields();
for (int i = 0; i < f.length; i++) {
Field field = f[i];
System.out.println(field.getName());
}
}
Diesen Anwendungsfall gibts bei Maps auch nicht. Entweder willst du einen Wert holen [c]V get(K)[/c], speichern [c]put(K, V)[/c], löschen [c]remove(K)[/c] oder mit [c]entrySet().iterator()[/c] über alles iterieren.
mehrere Strings haben denselben hashCode(), das ist schon ein gewisser Punkt,
in einer Map bzw. allen ernsthaften Anwendungen für hashCode() wird aber danach noch equals geprüft
Es gibt beliebig viele Strings, da ist es klar dass es beim hashCode() zu Kollisionen kommen muss.
Aber wie du schon sagst, das stört die Map ja nicht wirklich, entscheidend ist dann dass equals() richtig implementiert ist. Und das ist beim String denke ich der Fall.
Das ist für mich jetzt kein Argument String als HashMap Key zu verteufeln
void geheimnisVolleVariablenNamenAusgebeFunction(){
Field[] f = this.getClass().getDeclaredFields();
for (int i = 0; i < f.length; i++) {
Field field = f[i];
System.out.println(field.getName());
}
}
Das tut mir leid, DAS sollte jetzt nicht der Aufhänger für den Thread werden.
Und meine erklärung ist rein Subjektiv:
Ich kann mir Zahlen einfach besser Merkenn, kenne von [STRIKE]fast[/STRIKE] jedem/r bei uns in der Klasse die Telephon Number und nur von ungefähr der Hälfte den Namen ;(.
@Alle besetzt: Klar, statt "app.update.cert.requireBuiltIn" (ein Property als Beispiel von Firefox) würdest du lieber 634 nehmen? Viel Spass
einen logischen aufbau haben geht das ja. Aber woher will ich wissen das es diesen Baum an *Property* wirklich gibt? Bei zahlen kann man immer ++ nehmen.
mehrere Strings haben denselben hashCode(), das ist schon ein gewisser Punkt,
in einer Map bzw. allen ernsthaften Anwendungen für hashCode() wird aber danach noch equals geprüft
Der Hashcode kann unmöglich eindeutig sein, wenn er weniger Bits hat, als die Daten im Objekt zusammengezählt. Diese Erkenntnis ist übrigens so alt wie die Begriffe Checksumme, Parity und ähnliche ;-)