2016-03-30 21 views
1

Ich habe folgendes Objekt,Überprüfen Sie, ob ein ein Objekt in Java enthält

public class Pair { 
    private int row; 
    private int col; 

    public Pair(int row, int col){ 
     this.row = row; 
     this.col = col; 
    } 

    public int getRow(){ 
     return row; 
    } 
    public int getCol(){ 
     return col; 
    } 
} 

ich diese Paare in einer Warteschlange zu speichern, aber wan't zu überprüfen, ob die Queue das Paar bereits enthält. Das ist mein Code.

Queue<Pair> queue = new LinkedList<>(); 
if(!queue.contains(new Pair(curr.getRow(), curr.getCol()){ 
//do something 
} 

Dies funktioniert nicht und die Queue doppelte Werte speichert. Kann mir jemand helfen zu verstehen warum und wie kann man das beheben?

+1

Überschreiben Sie gleich(), um einen benutzerdefinierten Vergleich zu implementieren. Im Moment prüft es nur die Objektgleichheit. – dambros

Antwort

4

Sie überschreiben nicht Object.equals(Object), so dass Sie nur für die Referenzidentität Gleichheit erhalten. Sie brauchen so etwas wie

@Override 
public boolean equals(Object o) { 
    if (o instanceof Pair) { 
     Pair other = (Pair) o; 
     return row == other.row && col == other.col; 
    } 
    return false; 
} 

hinzuzufügen und wann immer Sie equals außer Kraft gesetzt wird dringend empfohlen, dass Sie Object.hashCode() auch außer Kraft setzen (arbeiten mit HashSet s zum Beispiel) wie

@Override 
public int hashCode() { 
    return Integer.hashCode(row) + Integer.hashCode(col); 
} 

Schließlich könnten Sie auch übersteuern Sie Object.toString(), damit Sie diese Pair s leicht anzeigen können. Etwas wie,

@Override 
public String toString() { 
    return String.format("Pair: (%d, %d)", row, col); 
} 
+1

Vielleicht fügen Sie eine Erklärung/Link zum 'equals' und' hashcode' Vertrag hinzu? –

+1

@YassinHajaj Guter Punkt. Links hinzugefügt. –

Verwandte Themen