# HashMap key ändern



## Generic1 (18. Jul 2008)

Morgen,

meine HashMap ist folgendermaßen aufgebaut:


```
Hap<String, MyObject> myMap = new HashMap<String, MyObject>();
```


jetzt kann es in meinem Programm vorkommen, dass sich der key von myMap ändert (key = MyObject), 
Meine Frage geht in die Richtung, ob es möglich ist, einfach den Namen des keys zu ändern (also einfach statt key = MyObject    ->   newkey = MyObject) ohne das ich das Object in der HashMap lösche und das neue hinzufüge?


so eine Methode in der Art myMap.setNewKey(String key, String newKey);

schönen Tag noch,


----------



## SlaterB (18. Jul 2008)

kann man von A nach B kommen, ohne sich zu bewegen?

was soll diese Frage, warum nicht das naheliegende Entfernen + Wiedereinfügen?


----------



## Generic1 (18. Jul 2008)

da muss ich ja das Object herausnehmen (mit get("key")) dann kopieren, dann wieder einfügen und das alte entfernen,

das ist ja doppelte und dreifache Arbeit wenn ich nur einen Referenznamen ändern will,


----------



## SlaterB (18. Jul 2008)

wieso kopieren, was ist da doppelte Arbeit? 
das geht alles in einer kleine Zeile:
map.put(newKey, map.remove(oldKey));

natürlich ist selbst diese Zeile nicht schön, falls man sie an zehn Stellen im Programm braucht,
ich ermutige dich, die Map-Klasse zu überschreiben und eine Operation
setNewKey(String key, String newKey); 
zu implementieren

die wird aber auf jeden Fall nur diesen Code enthalten können, ein anderes Verfahren scheint mir allgemein nicht sinnvoll,
evtl. noch auf Nichtvorhandensein des alten Keys prüfen und eine Exception werfen


----------



## Generic1 (18. Jul 2008)

ja da hast Du recht, ich hab nicht bedacht, das remove() das Object zurückgibt,
herzlichen Dank, funkt!!


----------



## BjörnBu (18. Jul 2008)

Ich würde eher nicht die jeweilige Map implementierung überschreiben, sondern das Ganze eher in der Klasse die es benötigt in 'ne Methode auslagern.

Prinzipiell ist so eine Art von Verhalten natürlich besser bei der Map aufgehoben, aber meines WIssens nach geht das Ändern eines Keys rein technisch nicht. Ein anderer Key erforder eine Umstrukturierung der gesamten Map mit eben dem Algorithmus der zum Hinzufügen udn Entfernen eines Entries verwendet wird.

Eine setNewKey-Methode wäre deshalb von der Benennung her irreführend.

@generic: Solltest du performance Einwände gegen Slater's Lösung haben: Das Objekt wird beim get nicht wirklich kopiert sondrrn du holst dir nur eine zusätzliche Referenz drauf. Das einzige, was intern wirklich passiert ist das Map-umschicht-Gedöns beim Hinzufügen und Entfernen. Und wenn sich ein Key "ändern" soll, muss das immer so sein.

Solltest du diesen Anwendungsfall sehr oft in deiner Anwendung finden, lohnt es eventuell auch drüber nach zu denken, ob man das eventuell ganz anders Lösen sollte bzw. was sich da wirklich ändert. Von der Idee einer Map her, sind ändern sich grade Keys eigentlich nicht


----------

