2016-06-26 14 views
0

Ich habe eine Klasse mit 2 Feldern erstellt. Ein Double und eine Line2D. Ich möchte die Methode equals außer Kraft zu setzen, so dass der folgende Code return trueÜberschreiben von Hashcode und equals für benutzerdefinierte Klasse

public class Main { 

    public static void main(String[] args) { 
     StatusLinePair slp1 = new StatusLinePair(25.0, new Line2D.Double(123.0, 32.0, 342.0, 54.0)); 
     StatusLinePair slp2 = new StatusLinePair(25.0, new Line2D.Double(123.0, 32.0, 342.0, 54.0)); 

     System.out.println(slp1.equals(slp2)); 
    } 

} 

Dies ist, was ich versucht habe, aber ich bin immer noch nicht immer die gewünschten Ergebnisse

public class StatusLinePair { 
    public Double yAxisOrder; 
    public Line2D line; 

    public StatusLinePair(Double yAxisOrder, Line2D line) { 
     this.yAxisOrder = yAxisOrder; 
     this.line = line; 
    } 

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

    @Override 
    public boolean equals(Object obj) { 
     StatusLinePair other = (StatusLinePair) obj; 

     if (this.yAxisOrder == other.yAxisOrder && this.line.getX1() == other.line.getX1() 
       && this.line.getX2() == other.line.getX2() && this.line.getY1() == other.line.getY1() 
       && this.line.getY2() == other.line.getY2()) 
      return true;   

     return false; 
    } 
} 

Bitte helfen Sie mir. Danke im Voraus!

+0

was ist Ihre Frage? – Andrew

+0

Was ist das Problem? Du hast keine Frage gestellt. Ich schlage vor, die folgenden Themen zu lesen und erneut zu fragen, ob Probleme auftreten: siehe [hier] (http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and- hashcode-methods-in-java) und [hier] (http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and-hashcode-methods-in-java). – RK1

Antwort

1

Sie verwenden nicht Line2D.equals, also nehme ich an, dass dies nicht so implementiert ist, wie Sie es benötigen, oder Sie würden es verwenden. Wenn dies der Fall ist, sollten Sie auch Line2D.hashCode() nicht verwenden.

Kurz gesagt, verwenden Sie entweder Line2D.hashCode() und Line2D.equals(), oder nicht, verwenden Sie keine Mischung.

2

Es gibt mehrere Probleme mit Ihrem Code:

  • sollte es falsch zurück, wenn das andere Objekt kein StatusLinePair ist, anstatt eine Classcast werfen
  • es falsch zurückgeben sollte, wenn das andere Objekt null ist, Anstatt eine NullPointerException zu werfen
  • sollte es nicht vergleichen Double Instanzen mit ==, aber mit equals() (oder die Klasse sollte ein Doppel statt ein Double enthalten, da es nicht Nullbar sein scheint): das ist die Ursache für Ihre spezifisches Problem.
  • es sollte nicht Line2D.hashCode() verwenden, da es nicht Line2D.equals()
1

Durch die Verwendung == Sie vergleichen nicht den tatsächlichen Wert des Objekts, sondern die refrence zu verwenden ist.

For example: 
    Object a = new Object(); 
    Object b = a;    // if you compare these two objects with == it will return true 

But 
    Object a =new Object(); 
    Object b = new Object(); // if you compare these two objects with == then it will return false as they are pointing to two different objects 

Durch das Überschreiben equals() können Sie zwei Objekte auf der Grundlage ihrer Werte vergleichen. check this link out for more on equals.

Ich hoffe, das ist hilfreich. ThankYou

-1

Schau mal hier:

Richtlinien für die Equals() und Operator == Überladen: https://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

UND

die Richtlinien für die Überlastung GetHashCode: https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.80).aspx

es ist in C# aber ist fast gleich!

+0

Das beantwortet die Frage nicht und ist irrelevant, da es sich bei der Frage um Java und nicht um C# handelt. Und übrigens, dein zweiter Link ist kaputt. –