# Warum hat HashSet kein get(Object o) ?



## Biesterfeld (18. Apr 2005)

Hej Leute,

ich hoffe ihr fasst das nicht als Sinnlosposting ab, aber ich verzweifel grade und mir erschließt es sich auch einfach nicht:

Warum kennt  java.util.HashSet die Methode get(Object o) nicht? Und wie umgeht ihr das?

Achso kurzer Hintergrund, ich habe für das entsprechende Object equals() und hashCode() überschrieben weil ich die Objekte bereits als identisch betrachte wenn nur bestimmte Kriterien erfüllt sind. Nun möchte ich also wenn ein Object, was u.U. zwar eine andere Instanz ist aber nach meinem Kriterium dennoch gleich zu einem Set-Eintrag, nicht zu dem Set addiert wissen, dann aber das Object welches bereits drin ist noch verändern:


```
if(! mySet.add(myObject)){
  ((MyObject)mySet.get(myObject)).increaseMultiplicity(); // HashSet.get() gibst nicht
}
```

So wie krisch ich das sinnvoll hin ohne jedes mal das Set mit nem dämlichen Iterator zu druchlaufen? Warum kennt jede verdammte andere Collection get() nur ausgerechnet HashSet nicht?

Dank euch ganz herzlich. Ich weiß ihr könnt mir helfen! Ohne euch hätt ich meine Studienarbeit eh schon längst hingeschmissen! 

Beste grüße
Biesterfeld


----------



## bygones (19. Apr 2005)

ok - zeige mir eine Collection die get(Object o) hat ..... dann reden wir wieder


----------



## Sky (19. Apr 2005)

Also, so eine get-Methode macht nur sinn, wenn auch was dahinter steckt; z.B. mit get(KEY) bekomme ich einen VALUE. Nimm doch eine Hashmap oder eine Hashtable. Da kannste deinen KEY (verbunden mit einem VALUE) ganz gemütlich eintragen und hast sogar ne get(Object o)-Methode.


----------



## Bleiglanz (19. Apr 2005)

was du wohl meinst?

soll get(Object o) etwa o zurückliefern, oder was soll denn der Rückgabewert sein???


----------



## Biesterfeld (19. Apr 2005)

Hm,

ich dachte ich hätte es erklärt, aber hoffentlich habe ich da nicht was falsch verstanden.

Also: Wenn ich z.B. an HashSet contains(object) frage, dann überprüft es doch für alle Objekte obinhs ob obinhs.equals(object) ist, oder nicht? Zumindest dachte ich mir das so.

Solange equals nicht überschrieben ist, überprüft equals() doch auf Gleicheit der Instanz. Wenn ich nun aber equals dahingehend überschreibe dass es nur auf Gleicheit bestimmter Eigenschaften der Instanz überprüft, kann ein get() doch einen Sinn haben: Ich überprüfe ob das Objekt bereits in der Menge enthalten ist und wenn ja, möchte ich bitte die Referenz aus der Menge bearbeiten und nicht die Referenz die ich bereits auf Vorhandensein geprüft habe. Ich sehe da nicht wie mir eine HashMap wirklich sinnvoll helfen kann, klar kann ich die Objekte zu ihrem überschriebenen hahsCode mapen (oder viel mehr andersrum). Das Problem dabei ist nur dass mir das nicht wirklich hilft weil der hashCode auch nur ein erstes Indiz auf Identität ist und ich dann doch wieder mit equals() die Gleicheit prüfen muss.
Ich finds umständlich!

Naja habs jetzt so gelöst, dass ich mit einem Vector arbeite dem kann ich wenigstens mit contains(), indexOf() und get() genau so bearbeiten wie ich das möchte, nicht schön aber geht!

Dank euch dennoch und beste Grüße
Biesterfeld


----------



## bygones (19. Apr 2005)

sorry ich versteh immer noch nicht ganz was du willst.... aber über vector mit indexOf get contains ist immens umständlich... da kannste du gleich per iterator rüber gehen...

warum ?

contains ist intern eine indexOf abfrage, indexOf läuft über den Vector und vergleicht per equals. d.h. du läufst mit der contains abfrage, dann der indexOf abfrage 2x über den vector und machst dann einen indexbasierten zugriff....


----------



## Bleiglanz (19. Apr 2005)

eventuell hättest du auf einer Kopie retainAll mit deinem Objekt als Liste mit einem Element ausführen können, dann wäre nur das gesuchte übriggeblieben.

(es geht nicht anders, was du willst ist ja dasjenige ding in deinem Set zu finden, das equals(o) ist; dazu muss über die ganze Collection iteriert werden!)

nimm eine Map und mach put(x,x) 

dann findet nämlich get() das Objekt, das equals zu deinem vorgegebenen ist...


----------



## Biesterfeld (19. Apr 2005)

Langsam werd ich äußerst unsicher, ob das so geht, wenn ihr schon nicht versteht was ich vorhabe...

Ich habe eine Klasse von der ich Instanzen erzeuge. Diese Instanzen sammel ich in einer Collection. So normalerweise überorüft doch ein nicht überschriebenes equals() auf Gleicheit der Instanz. Also wenn ich an ein Set contains(o) Frage habe ich bereits mit o genau die Instanz.

Soweit sogut. Nun überschreibe ich equals() dahingehend, dass zwei Instanzen auch dann gleich sind wenn nur einige Felder des Objektes gleich sind. Die idee war also nur nach diesen Kriterien eindeutige Objekte in ein Set aufzunehmen. Mit set.add(o) hätte ich mich also gar nicht weiter darum kümmern brauchen ob die gleich sind oder nicht.

So und nun die Erweiterung um die es mir geht: Wenn nun ein Objekt "doppelt" vorhanden ist soll es zwar nicht wieder in das Set aufgenommen werden, aber der doppelgänger der bereits in dem Set liegt soll verändert werden!

Ich machs jetzt nochmal ganz anders: Ich kehre zu dem HashSet zurück und laufe mit einem Iterator drüber der mir die Objekte erstmal mit equals prüft, ist das der Falls habe ich dan Doppelgänger direkt und kann ihn ändern, ansonsten wird das geprüfte objekt reingepackt.

Aber mein grundsätzliches Anliegen ist doch langsam klar geworden oder?


----------



## bygones (19. Apr 2005)

verstanden habe ich es glaub ich. Aber wie oben schon erwähnt, wenn du zugriff auf das objekt haben willst (direkt mein ich) geht das nur über die map !


----------

