2012-03-24 19 views
0

Ich weiß, dass die HashSet.contains() -Methode die equals-Methode verwendet, um die Gleichheit zu prüfen, da sie den Zeiger überprüft, um festzustellen, ob sie gleich sind.HashSet in Java - Vergleich und Hashtasten

Ich brauche es, um das tatsächliche Objekt am Zeiger auf Gleichheit zu überprüfen - in meinem speziellen Fall muss ich sehen, ob ein "Knoten" geöffnet wird (ein int [] Array) bereits in der HashSet. Dies ist wichtig für meinen Suchalgorithmus, so dass die Implementierung meiner bidirektionalen iterativen Vertiefungssuche nicht so naiv ist.

Ich würde immer noch gerne lineare Suchzeit, oder vielleicht sollte ich eine andere Klasse verwenden?

Danke für Ihre Hilfe.

+0

Sorry, aber warum bekommst du es nicht(), wenn es bereits in einem hashset ist? Dies wird O (1) sein, wenn der Hash-Satz nicht zu voll ist. – j13r

+0

@ j13r: Das OP möchte 'contains()' verwenden, was mit 'equals()' überprüft wird. –

+3

Soweit ich sehen kann, gibt es kein .get() für Java HashSets –

Antwort

5

Referenzgleichheit ist nur die Standardimplementierung von .equals(). Sie können Ihre Arrays in eine Wrapper-Klasse einfügen, die equals und hashCode überschreibt, um den Inhalt zu überprüfen. NB: Damit dies funktioniert, darf der Inhalt nicht geändert werden, nachdem Sie sie in den Satz gelegt haben.

import java.util.Arrays; 

public class IntArrayNode { 

private int[] array; 

public IntArrayNode(int[] array) { 
    this.array = array; 
} 

//getter and setter 

public boolean equals(Object obj) { 
    if (obj != null && obj instanceof IntArrayNode) { 
    return Arrays.equals(this.array, ((IntArrayNode) obj).array); 
    } else { 
    return false; 
    } 
} 

public int hashCode() { 
    return Arrays.hashCode(this.array); 
} 
} 
+0

Schnelle Frage zu Ihrer Antwort - so ist die. Equals() -Methode, die von. Contains() aufgerufen wird, die .equals-Methode für den gesuchten Typ? –

+0

Ja, wenn Sie einen 'Set set = new HashSet ();' Wenn Sie dann 'set.contains (someIntArrayNode);' verwenden, wird Ihr equals() verwendet. – Affe

+0

'instanceof' ergibt false, wenn obj gleich null ist. Daher ist keine zusätzliche Überprüfung erforderlich. Auf der anderen Seite könnte eine gute Anfangsprüfung sein, wenn obj == dies, in welchem ​​Fall Sie sofort True zurückgeben können. –

0

Wenn Ihr Objekt die Methode equals implementiert, können Sie einen beliebigen Vergleich durchführen, um festzustellen, ob zwei Ihrer Node Objekte eindeutig sind.

0

Die einfachste Abhilfe würde Collections.newSetFromMap(new IdentityHashMap<E, Boolean>()) (als Ersatz für HashSet) sein, die keine Verpackung Ihrer Elemente oder etwas zu tun, erfordert.

+0

Gute Idee, aber ich habe sowieso eine Wrapper-Klasse benutzt, und ich habe sie im Beispiel aus Gründen der Allgemeinheit nicht benutzt. –