2009-07-09 4 views
0

Ich versuche den Wert von 2 Instanzen von x innerhalb eines Iterators zu vergleichen.Java: Objektwerte vergleichen

x ist ein Referenztyp, der eigene Datenelemente enthält. Ich versuche, eine Instanz von x mit einer anderen zu vergleichen, um festzustellen, ob die Werte in beiden gleich sind.

if (x.equals (x))

hält auf true Auswertung wenn tatsächlich der Wert jeder Instanz von x verschieden ist.

Prost.

+0

was meinst du mit 'jede Instanz von x ist anders'? Können Sie tatsächlich einen konkreteren Code bereitstellen? – notnoop

+0

x.equals (x) wird immer wahr sein .... so wird x == x Was meinst du wirklich? – hhafez

+0

Wenn Sie die Implementierung von equals() nicht vollständig aus dem Gleichgewicht gebracht haben, vergleichen Sie dieselbe Instanz mit sich selbst, indem Sie x.equals (x) aufrufen, und es wird immer true zurückgegeben. Was versuchst du genau zu machen? –

Antwort

8

Code Unter der Annahme, sieht nicht wirklich wie diese

X x = new X(); 
if(x.equals(x)) 

sondern eher wie

X x = new X(); 
X y = new X(); 

if(x.equals(y)) { } 

Und Sie werden immer falsche Werte für x.equals(y) dann Ihre Implementierung von Gleichen ist gebrochen.

Gehen Sie zu Ihrem Class X und überprüfen Sie, wie Equals implementiert ist. Wenn es nicht in X implementiert ist, checken Sie die Superklasse ein.

1

Dies ist eine schwierige Frage mit den angegebenen Details zu beantworten. Sie müssen Objekte und keine Primitiven sein, um eine .equals-Methode zu haben. Wurde die equals-Methode auf eine Weise außer Kraft gesetzt, die zu fehlerhaften Vergleichen führt? Das wäre der Ort, den ich mir ansehen würde.

0

Es klingt wie Sie Referenzen und nicht Daten vergleichen.

EDIT: Von der API doc für Objekt: „Die Methode equals für Klasse Objekt der kritischste möglich ¨Aquivalenzrelation auf Objekte implementiert, das heißt, für alle Nicht-Null-Referenzwerte x und y, diese Methode liefert true genau dann, wenn sich x und y auf dasselbe Objekt beziehen (x == y hat den Wert wahr). "

z Wenn 'X' oder seine Elternklassen keine Gleichheit überschreiben, dann wenn Sie equals aufrufen, dann wird es die Referenzen vergleichen, die, wenn sie das gleiche Objekt sind, immer gleich sind.

Mit den Geräuschen davon müssen Sie die Equals-Methode in der Klasse 'X' überschreiben, aber dann wieder, was Sie sagen, scheint darauf hinzuweisen, dass sie irgendwie die gleiche Referenz sind?

+0

yuh, wie kann ich die Daten vergleichen? – burntsugar

+0

mit equals() das ist, wofür es verwendet wird – hhafez

+0

Nein, sie sind verschiedene Referenzen. Der Versuch, gleich zu überschreiben, ist gleich. Prost – burntsugar

0

Die Methode equals in der Klasse Object führt eine Instanzgleichlaufoperation aus. Es ist jedoch üblich, dass Unterklassen von Object diese Methode überschreiben, um eine Relative-Equal-Operation auszuführen, bei der die Werte innerhalb des Zielobjekts mit den Werten des betreffenden Objekts verglichen werden. In Ihrem Fall verwenden Sie höchstwahrscheinlich eine Unterklasse von Object, die die Methode equals überschrieben hat. Es wäre gut zu wissen, wie die equals Methode Ihrer Klasse X implementiert ist.

0

Ich gehe davon aus, dass Ihre beiden X-Objekte tatsächlich verschiedene Objekte sind, und nicht versehentlich das gleiche Objekt. In diesem Fall ist das Problem die equals() - Implementierung für diese Klasse. Überprüfen Sie Ihre Klasse und ihre Oberklassen auf die equals() - Implementierung und stellen Sie sicher, dass sie tatsächlich intelligent vergleicht. Schreiben Sie gegebenenfalls Ihre eigenen.

class Square 
{ 
    public int length; 

    public boolean equals(Square s) 
    { 
     return this.length == s.length; 
    } 
} 
0

Wenn Sie sich entscheiden equals () außer Kraft zu setzen, außer Kraft setzen auch hashcode()