java methode La méthode personnalisée Contient ArrayList




methode contains java (3)

J'ai un objet

class A {
  private Long id; 
  private String name; 
  public boolean equals(Long v) {
     return this.id.equals(v);
  }
}

et ArrayList de ces objets. Ce que je veux, c'est pouvoir vérifier si cette liste contient un champ objet par objet. Par exemple:

ArrayList<A> list = new ArrayList<A>(); if (list.contains(0L)) {...}

mais la méthode Equals surchargée ne m'aide pas. Qu'est ce que je fais mal? Je vous remercie

UPDATE Et devrais-je aussi remplacer une méthode de hashcode ()?


Qu'est ce que je fais mal?

Vous n'êtes pas prépondérant. Vous êtes surchargé.

La méthode contains appelle la méthode equals avec signature equals(Object) , donc cette méthode (nouvelle) que vous avez ajoutée ne sera pas appelée.

L'autre problème est que votre méthode equals la sémantique de contains . La méthode contains doit comparer this à un objet qui pourrait être membre de la liste. Votre liste ne contient pas d'objets Long . Il contient des objets de type A

Maintenant, vous pouvez vous en sortir ... si vous utilisez des types de liste bruts ... mais ce que vous essayez de faire est une violation du contrat de l'API et une mauvaise pratique. Une meilleure solution est d'itérer et de tester explicitement les éléments de la liste.

Et devrais-je aussi remplacer une méthode de hashcode ()?

Si vous remplacez equals(Object) vous devez également remplacer le hashcode() .

Cela ne fera aucune différence ici, mais c'est essentiel si vous placez vos objets A dans des structures de données hachées. Et comme vous ne savez pas ce que le gars suivant va faire avec votre code, il est bon de s’assurer que sémantique est compatible avec equals(Object) et hashCode() .


Vous n'avez pas remplacé la méthode dans votre classe. Pour remplacer, les paramètres de la méthode doivent également être du même type.

CA devrait etre

public boolean equals(Object o) {

}

où comme dans votre cas c'est

public boolean equals(Long o) {

 }

vous avez probablement besoin de le faire

public boolean equals(Object o)
    {
        if (o == null) return false;
        if (o == this) return true; //if both pointing towards same object on heap

            A a = (A) o;
        return this.id.equals(a.id);
    }

Voici un code qui pourrait montrer comment cela fonctionne:

import java.util.ArrayList;

class A {
  private Long id; 
  private String name; 

  A(Long id){
      this.id = id;
  }

    @Override
  public boolean equals(Object v) {
        boolean retVal = false;

        if (v instanceof A){
            A ptr = (A) v;
            retVal = ptr.id.longValue() == this.id;
        }

     return retVal;
  }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }
}

public class ArrayList_recap {
    public static void main(String[] args) {
        ArrayList<A> list = new ArrayList<A>(); 

        list.add(new A(0L));
        list.add(new A(1L));

        if (list.contains(new A(0L)))
        {
            System.out.println("Equal");
        }
        else
        {
            System.out.println("Nah.");
        }    
    }

}

Tout d'abord, il y a un remplacement de la méthode égal (Object o). Ensuite, il y a aussi le remplacement du hashCode (). Notez également que l'instance du contrôle A dans les équivalents garantira que vous n'essayez pas de comparer différents objets.

Cela devrait faire l'affaire! J'espère que ça a aidé! À votre santé :)





contains