HashSet (oder besser geignetes)

Andi_CH

Top Contributor
Ich bin auf der Suche nach einer geeineten Datenstruktur.

Muss:
- Iterierbar sein
- Elemente nur einmal beinhalten

HashSet kann das alles aber ich stell mich ungeschickt an ;-)

Die gespeicherten Daten sind eine Objekte einer eigenen Klasse - what the hell muss ich in dieser überschreiben, damit Gleicheit erkannt wird?

equals() ist es nicht, compareTo() ist es nicht .... (Sind beide implementiert werden aber nicht aufgerufen)

Wer hilft mir auf die Sprünge?
 
Ich bin mir nicht sicher. Aber aufgrund des Namens schätze ich mal: es wird der Hash-Wert verglichen.

Edit Meine Vorredner sind der gleichen Meinung, also hatte ichs noch richtig in Erinnerung 🙂
 
ha lustig sehe garade dass HashSet intern eine HasMap verwendet

Java:
 public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

key.hashCode()... das ist es... aber was speichert er dann als value...


Java:
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

ok Josh warum nicht...
 
Danke!

Wenn hashCode() drin ist, wird auch equals() aufgerufen - interessant. Warum nicht gleich so 😀

Jetzt kommt einfach die Frage auf, wie ich aus einem String und einem int einen guten HashCode "bastle", aber das scheint gar nicht so kritisch - wenn ich es richtig sehe wird bei gleichen HashCode die equals-Methode aufgerufen.

EDIT: Zeile 8 im Code bei ARadauer ....
 
ha lustig sehe garade dass HashSet intern eine HasMap verwendet
Das ist gar nicht so unüblich 😉

Ansonsten haben darekkay und njans natürlich recht, wenn man sich an equals wagt, muss man auch hashcode überschreiben, und umgekehrt.

Jetzt kommt einfach die Frage auf, wie ich aus einem String und einem int einen guten HashCode "bastle", aber das scheint gar nicht so kritisch - wenn ich es richtig sehe wird bei gleichen HashCode die equals-Methode aufgerufen.
String haben schon einen guten hashcode 😉
equals wird nach gleichem hashcode aufgerufen um Kollisionen zu erkennen.
 
Eclipse:
Rechtsklick->Source->generate HashCode and Equals.

Das ist aber ein echt geiles Feature! Ich glaub das stimmt sogar was da generiert wird 😉

Woher wohl die 31 kommt ???:L

Java:
private String serverName;
private int port;

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + port;
	result = prime * result + ((serverName == null) ? 0 : serverName.hashCode());
	return result;
}

EDIT und was passiert wohl wenn port = MAXINT ist ??? na ja ....
 
Zuletzt bearbeitet:
Hä??? Ich hab gesagt = MAXINT nicht grösser als MAXINT.

Bin halt Ada geschädigt - ich erwarte immer Exceptions wenn irgendwo irgendwas überläuft ...
 

Zurück
Oben