3 votes

[Java] Utilise indexOf equals?

Je me demandais comment la méthode indexOf d'un ArrayList est implémentée. En fait, j'ai surchargé la méthode equals comme ceci :

public class CustomObject {
@Override 
    public boolean equals(Object o) {

        if(o instanceof CityLoader)
            return ((CityLoader)o).getName() == this.name;
        else if (o instanceof String)
            return this.name.equals((String)o);         
        return false;
    }
}

Je pensais que cela m'éviterait de surcharger également la méthode indexOf mais il semble que je me trompe complètement. Lorsque j'essaie

ArrayList customObjects = new ArrayList
... insérer customobject dans la arraylist ...
customObjects.indexOf(new String("name")) 

indexOf retourne false mais il devrait retourner true. (J'ai vérifié que l'élément que je recherche existe)

Suis-je complètement dans l'erreur ?

6voto

Eran Points 35360

equals ne doit jamais renvoyer true lorsque les objets comparés ne sont pas du même type (dans votre cas CustomObject, equals devrait toujours renvoyer false lorsque o n'est pas une instance de CustomObject).

L'implémentation de indexOf utilise en fait equals de String au lieu de equals de votre CustomObject lorsque vous lui passez une String, et equals de String renvoie false lorsque vous lui passez un objet qui n'est pas une String.

De plus, n'utilisez pas == pour comparer des chaînes de caractères.

Vous devriez passer une instance de CustomObject à indexOf :

customObjects.indexOf(new CustomObject("name")) 

(ou peu importe à quoi ressemble le constructeur de CustomObject)

Votre méthode equals devrait ressembler à ceci :

public boolean equals(Object o) {
    if(!(o instanceof CityLoader))
        return false;
    CityLoader other = (CityLoader)o;
    return other.name.equals(this.name);
}

1voto

nullpointer Points 1135
customObjects.indexOf(new String("name")) 

C'est ce que vous faites de travers. Vous cherchez l'index d'une String à l'intérieur d'une liste d'objets CustomObject.

À partir de la documentation Java :

 /**
     * Retourne l'index de la première occurrence de l'élément spécifié
     * dans cette liste, ou -1 si cette liste ne contient pas l'élément.
     * Plus formellement, retourne l'index le plus bas i tel que
     * (o==null ? get(i)==null : o.equals(get(i))),
     * ou -1 s'il n'y a pas de tel index.
     *
     * @param o élément à rechercher
     * @return l'index de la première occurrence de l'élément spécifié dans
     *         cette liste, ou -1 si cette liste ne contient pas l'élément
     * @throws ClassCastException si le type de l'élément spécifié
     *         est incompatible avec cette liste
     *         (optionnel)
     * @throws NullPointerException si l'élément spécifié est null et que cette
     *         liste n'accepte pas les éléments null
     *         (optionnel)
     */
    int indexOf(Object o);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X