2017-03-06 2 views
2

Donc, j'essaie de contourner equals() alors quand je fais un ensemble de mes objets, il fonctionnera correctement.en utilisant ma propre méthode égale pour un ensemble

Voici le code je travaille (en ignorant la sécurité de type pour l'instant)

@Override 
public boolean equals(Object o) { 
    MyClass myObject1 = (MyClass) o; 
    MyClass myObject2 = (MyClass) this; 
    if (myObject1.property == myObject2.property) 
     return true; 
    return false; 
} 

Vous pouvez supposer qu'il n'y a qu'une seule propriété et il est un type primitif comme un int. Cependant, si j'ajoute deux des mêmes objets à un ensemble, ils sont tous les deux ajoutés.

+0

Je ne pense pas que vous ayez besoin de MyClass myObject2 = (MyClass) this; '. Vous pouvez vous débarrasser de cette ligne et utiliser 'myObject1.property == this.property' dans l'instruction if. – Eric

Répondre

3

C'est parce que vous avez enfreint Java requirement for overriding equals:

Notez qu'il est généralement nécessaire de remplacer la méthode hashCode chaque fois que cette méthode est surchargée, de façon à maintenir le contrat général pour la méthode hashCode, qui stipule que l'égalité les objets doivent avoir des codes de hachage égaux.

Sans une implémentation de hashCode qui renvoie des valeurs identiques pour les objets égaux d'un ensemble de hachage traitera généralement des objets avec des codes de hachage distincts aussi différents, à moins d'une collision de hachage. Une fois que vous implémentez hashCode pour votre classe, le problème sera résolu.

+0

merci qui a fonctionné –

1

Vos classes doivent passer outre equals et hashCode

De l'ensemble Documentation

Une collection qui ne contient aucun élément en double. Plus formellement, les ensembles ne contiennent aucune paire d'éléments e1 et e2 tels que e1.equals (e2), et à plus d'un élément nul. Comme implicite par son nom, cette interface modélise l'abstraction de l'ensemble mathématique .

L'interface Set place stipulations supplémentaires, au-delà des héritées de l'interface de collecte, sur les contrats de tous les constructeurs et sur les contrats du complément, égale et hashCode méthodes.

à remplacer ces méthodes que vous pouvez faire ceci:

public class Person { 
    private String name; 
    private int age; 
    // ... 

    @Override 
    public int hashCode() { 
     return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers 
      // if deriving: appendSuper(super.hashCode()). 
      append(name). 
      append(age). 
      toHashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (!(obj instanceof Person)) 
      return false; 
     if (obj == this) 
      return true; 

     Person rhs = (Person) obj; 
     return new EqualsBuilder(). 
      // if deriving: appendSuper(super.equals(obj)). 
      append(name, rhs.name). 
      append(age, rhs.age). 
      isEquals(); 
    } 
} 

https://stackoverflow.com/a/27609/1754020

+0

Je devais marquer Dasblinkenlight comme correct parce qu'il a répondu en premier, mais je vous remercie pour l'aide ainsi –

+0

vous êtes les bienvenus @BenArnao pas de soucis! merci pour l'upvote :) –

1

Il fonctionnerait bien si vous mettre en œuvre la méthode hashCode() comme ci-dessous.

public int hashCode(){ 
    return this.property.hashCode(); 
    } 

S'il vous plaît noter qu'il est obligatoire de passer outre méthode hashcode de classe d'objets lorsque vous OVERIDE est égal à la méthode de classe d'objets.

Lors de l'appel de la méthode add d'un ensemble donné, la méthode hashCode est appelée en premier - une fois qu'ils (comme un répertoire téléphonique) sont identiques, la méthode égale est vérifiée.