PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Dynamische Objektnamen" in Java


Zarathustra
2003-07-30, 16:51:54
Ich habe ein ziemlich dringliches Problem, dessen Lösung mir aber auch generell helfen würde:
Normalerweise werden Objekte doch beim Erzeugen mit einem Namen versehen und somit eindeutig identifiziert.
Wie kann ich einem Objekt, wenn ich es erzeuge, einen Namen geben, der zuvor von einer Methode in z.B. einen String erzeugt wird?
Es soll damit erreicht werden, dass ich eine Liste mit dynamischer Länge mit Objekten füllen kann, indem die Objekte darin Namen kriegen wie "ob001"..."ob012", wobei der hintere Teil beim erzeugen fortgezählt wird;
oder so, dass das Objekt, welches ein Character-Element enthält, diesen Buchstaben auch als Namen erhält.
Ich hoffe, ich habe mich klar ausgedrückt.
Ich möchte schonmal allen danken, die mir bei diesem Problem zu helfen versuchen.

Xmas
2003-07-30, 19:51:55
Wofür genau brauchst du denn so etwas? Schon mal daran gedacht, eine Hash Table dafür zu verwenden (wobei ich nicht weiß inwiefern Java so etwas bereitstellt)?

Zarathustra
2003-07-30, 23:11:06
Zur Implementierung eines dynamischen binären Suchbaums.

Mit hashing habe ich aber noch garkeine Erfahrung.:(

Dr.Doom
2003-07-30, 23:50:15
Wieso machst du nicht eine Liste von Objekten? Dann brauchst du dem jeweiligen Objekt nichtmal 'direkt' einen Namen geben, sondern verschiebst den Namen ins Objekt als ein Attribut (die ja schliesslich zur Objektbeschreibung da sind).


class IamAnObj {

String objName;

IamAnObj (String name) {
this.name = name;
}

String getName() {
return name;
}

public static blah main (...)

LinkedList objList = new LinkedList();
objList.add(new IamAnObj("Name1"));
objList.add(new IamAnObj("Name2"));
...
}// end main

}//end class


Naja, keine Ahnung, hab's mir gerade aus den Fingern gesogen *g*

EgonOlsen
2003-07-30, 23:55:12
Original geschrieben von Zarathustra
Zur Implementierung eines dynamischen binären Suchbaums.

Mit hashing habe ich aber noch garkeine Erfahrung.:(
Musst du eigentlich auch nicht, es ist schon eine Implementierung dabei (oder besser gesagt sogar 2). Kannst z.B. eine Hashtable nehmen...etwa so:


Hashtable fummel=new Hashtable();
for (int i=0; i<MAX_IRGENDWAS; i++) {
TollesObject ganzToll=new TollesObject();
fummel.put("obj_"+i, ganzToll);
}


Darauf kannst du dann mittels "fummel.get(objectName)" zugreifen. Ist nicht ganz das, was du meinst, aber ein eval() wie in Javascript gibt es nicht. Kannst auch stattdessen einen HashMap nehmen...verhält sich sehr ähnlich, ist aber nicht Thread-Safe und dadurch sogar etwas schneller.

Zarathustra
2003-07-31, 13:08:43
Original geschrieben von Dr.Doom
LinkedList objList = new LinkedList();
objList.add(new IamAnObj("Name1"));
objList.add(new IamAnObj("Name2"));
...


Naja, keine Ahnung, hab's mir gerade aus den Fingern gesogen *g*

Es geht mir vor allem um die dynamische Erzeugung der NAMEN, quasi während der Laufzeit! Denn sonst müsste ich, wie du in dem Beispiel, die Objekte aufzählen...

EgonOlsen
2003-07-31, 13:12:38
Original geschrieben von Zarathustra
Es geht mir vor allem um die dynamische Erzeugung der NAMEN, quasi während der Laufzeit! Denn sonst müsste ich, wie du in dem Beispiel, die Objekte aufzählen... ??? Dann erzeuge sie doch einfach...so wie in meinem Hashtable-Beispiel...oder verstehe ich jetzt das Problem nicht?

Xmas
2003-08-01, 20:52:59
Original geschrieben von Zarathustra
Es geht mir vor allem um die dynamische Erzeugung der NAMEN, quasi während der Laufzeit! Denn sonst müsste ich, wie du in dem Beispiel, die Objekte aufzählen...
Ich sehe wirklich dein Problem nicht. Was genau willst du denn mit diesen "Namen" erreichen. Möchtest du die Objekte über Namensstrings ansprechen? (Wenn ja, wieso reicht kein Index?) Dann reicht doch die Hashtable.

Zarathustra
2003-08-04, 12:30:31
Wie gesagt, mit den "Hash"-Sachen kenne ich mich noch nicht aus. Ich werde mich mal damit beschäftigen...

Danke für eure Hilfe!;D

HellHorse
2003-08-05, 00:12:04
Original geschrieben von Zarathustra
Wie gesagt, mit den "Hash"-Sachen kenne ich mich noch nicht aus. Ich werde mich mal damit beschäftigen...

Danke für eure Hilfe!;D
Um die Hash-Funktion brauchst du dich nicht zu kümmern. Die Funktionalität die sowohl HashTable wie auch HashMap bereitstellen ist in Map definiert.
Bei Map geht es darum Schlüssel auf Werte abzubilden. Mehrere Schlüssel können auf den gleichen Wert abgebildet werden, umgekehrt aber nicht.

Um bei deinem Beispiel zu bleiben, lässt sich z.B. ein Ojekt mit Hilfe eines Strings finden (dein dynamischer Objektname).

String s = ......; //ein String von irgendwo
Object o = ......; //ein Objekt von irgendwo
Map m = new HashMap();
m.put(s,o);
//m.get(s); wird jetzt o zurückgeben
//du kannst problemlos einen zweiten Schlüssel auf o abbliden
m.put("ein anderer String",o);
//m.get("ein anderer String"); wird genauso o zurückgeben
//solt jetzt s auf ein anderes Objekt zeigen, machst du einfach
Object o2 = ....; //ein Objekt von irgendwo
m.put(s, o2);
//m.get(s); wird jetzt o2 zurückgeben
//m.get("ein anderer String"); wird o zurückgeben

Das einzige worum du dich kümmern solltest ist falls du equals() überschreibst und das für zwei Objekte gleich ist, muss der Rückgabewert von hashCode() auf gleich sein. Das Umgekehrte muss nicht zutreffen.