Java Hashtable

satix500

Lieutenant
Dabei seit
Apr. 2007
Beiträge
513
Hallo,

Ich frage mich, wie man in Java folgende Abbildung programmtechnisch abbilden kann:

Key<Integer> ---> Value<Set<String>>

und zwar so, dass ich den Set um neue Strings erweitern kann, somit muss der Set dynamisch sein. Als Beispiel:
1 --> {"abc"}
nach Hinzufügen von neuen Strings zu dem Set:
1 --> {"abc","def"}

usw.

Mit den Klassen, die das Interface "Map" implementieren, kann man das wahrscheinlich nicht hinkriegen, weil sie meines Wissens nur eine statische Zuordnung erlauben.
 

BerniG

Lieutenant
Dabei seit
Okt. 2004
Beiträge
620
Nimm halt eine HashMap. Als Value nimmst du ne Arraylist mit Strings.
Zum Hinzufügen eines Elements musst du natürlich dann erst mit get() die Arraylist holen und dorthinein den Wert setzen (bzw. eine neue ArrayList anlegen wenn durhc get() null zurückgeliefert wurde). Das kann man aber ja schön in ner Funktion unterbringen, so dass es nach außen hin transparent ist (evtl. auch Vererbung nutzen?).
 

satix500

Lieutenant
Ersteller dieses Themas
Dabei seit
Apr. 2007
Beiträge
513
HashMap vs. Hashtable:
The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls. This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.

Da hast mich aber auf eine Idee gebracht, die zur Lösung meines Problems geführt hat: Die Values, die da sind auslesen und speichern, dann um das neue Element erweitern, dann den Key löschen und ihn wieder neu mit dem neuen Set<String> hinzufügen.

Danke!
 

BerniG

Lieutenant
Dabei seit
Okt. 2004
Beiträge
620
Und wieso musst du das Set erst löschen und dann neu hinzufügen? Hol dir das Objekt einfach per get() aus der HashMap raus und füge dann auf dem Set die add-Methode aus! Ein Set hat ja gerade die Eigenschaft, dass man es erweitern kann und da die HashMap/HashTable nur die Referenz auf das Objekt speichert wirkt sich ein Aufruf von add() natürlich direkt aus!
Code:
Map<Integer,Set<String>> table = new HashMap<Integer,Set<String>>();
Set<String> entry = new HashSet<String>();
entry.add("test");
table.put(123, entry);
....
....weiteres Programm....
....
Set<String> retrievedEntry = table.get(123);
retrievedEntry.add("test2");
Set<String> retrievedEntry2 = table.get(123);        // diese erhaltene Set enthält jetzt "test" und "test2"!!!
 

satix500

Lieutenant
Ersteller dieses Themas
Dabei seit
Apr. 2007
Beiträge
513
Du hast natürlich recht. Ich habe übersehen, dass der Set nur referenziert und nicht etwa von Hashtable/Hashmap selber gespeichert wird.


Nun habe ich ein anderes Problem: ich möchte im weiteren Verlauf des Programms mit
table.remove(123);
den Key und den dazugehörigen Set<String> löschen. Hier tritt eine NullPointerException auf, weil
"Set<String> entry =" , auf welches in der Hashtable verwiesen wird , damit mit null referenziert wird und darüber nicht iteriert werden kann.
nach:

while(noch ein Key in der Hashtable da)
{
Set<String> entry = table.get(key);
Iterator<String> iterateEntry = entry.iterate();
while(iterateEntry.hasNext())
{
String str = iterate.next();
//do something
}
}

Wie kann ich nun den Key 123 löschen????
Ergänzung ()

Es hat sich erledigt!
 
Zuletzt bearbeitet:

BerniG

Lieutenant
Dabei seit
Okt. 2004
Beiträge
620
Du hast es ja eh schon aber vielleicht hilfts dir ja noch weiter:
Um alle Einträge durchzugehen kann man sich nen iterator() erstellen lassen. Performancemäßig wäre dafür eine LinkedHashMap allerdings besser. Zu beachten ist aber, dass der iterator nicht mehr funktioniert, sobald ein Objekt gelöscht oder hinzugefügt wird. Eine Ausnahme dafür ist aber die remove()-Methode, die vom iterator selbst bereitgestellt wird.
Alternativ dazu kann man auch mit entrySet() auf der HashMap sich ein Set aller Einträge holen und dort iterieren. Allerdings geht in diesem Set auch der Iterator kaputt sobald man in der HashMap was löscht ohne die remove()-Methode des Iterators selbst zu nutzen!
Gegen NullPointerException hilft übrigens generell eine Überprüfung auf "null" wenn man was aus so ner Map abholt.
 
Top