2016-05-24 8 views
0

Ich frage mich, wie die Methode indexOf einer ArrayList implementiert ist. In der Tat habe ich die Methode equals wie dies außer Kraft setzen:[Java] Ist indexOf gleich?

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; 
    } 
} 

Ich obwohl dies mich vermeiden wird auch die indexOf Methode außer Kraft zu setzen, aber es scheint, dass ich völlig falsch bin. Wenn ich versuche,

ArrayList<CustomObject> customObjects = new ArrayList<CustomObject> 
... insert customobject into the arraylist ... 
customObjects.indexOf(new String("name")) 

indexOf return false, aber es sollte true zurückgeben. (Ich habe das Element überprüft, das ich suche.)

Bin ich total falsch?

+0

* „Ich habe mich gefragt, wie die Methode indexOf eines Arraylist implementiert ist“ * Sie müssen nicht wissen, wie es ist * * implementiert, die Sie benötigen zu wissen, was der Vertrag ist. Dafür gibt es ein Tool: [The JavaDoc] (http://docs.oracle.com/javase/8/docs/api/java/util/List.html#indexOf-java.lang.Object-), das sagt: * "Gibt den Index des ersten Vorkommens des angegebenen Elements in dieser Liste zurück, oder -1, wenn diese Liste das Element nicht enthält. Formal gibt er den niedrigsten Index i zurück, so dass" (o == null? Get (i) == null: o.equals (get (i))) ', oder -1 wenn es keinen solchen Index gibt." * –

Antwort

4

equals sollte nie wahr zurück, wenn die verglichenen Objekte nicht vom gleichen Typ sind (in Ihrem Fall CustomObject ‚s equals immer falsch zurückgeben sollte, wenn o keine Instanz von CustomObject ist).

Die Implementierung von indexOf geschieht String ‚s equals statt Ihrer CustomObject‘ s equals zu verwenden, wenn Sie equals kehrt s ein String zu ihm, und String‘passieren falsch, wenn Sie es ein Objekt übergeben, der kein String ist.

Zusätzlich == im Vergleich zu Strings nicht verwenden.

Sie sollten eine Instanz von CustomObject zu indexOf passieren:

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

Sie haben Recht! Sollte ich den String gleich überschreiben? – user1315621

+1

@ user1315621 Nein, das geht nicht. String ist eine letzte Klasse. – Eran

+0

Danke. Es scheint also eine schreckliche Übung zu sein. Ich werde es vermeiden. Vielen Dank! – user1315621

0
customObjects.indexOf(new String("name")) 
:

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

(oder was auch immer der Konstruktor von CustomObject aussieht)

Ihre equals Methode sollte wie folgt aussehen

Das ist, was du falsch machst. Sie suchen nach einem Index einer String innerhalb einer CustomObject Objektliste.

aus der Java-Dokumentation:

/** 
    * Returns the index of the first occurrence of the specified element 
    * in this list, or -1 if this list does not contain the element. 
    * More formally, returns the lowest index <tt>i</tt> such that 
    * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>, 
    * or -1 if there is no such index. 
    * 
    * @param o element to search for 
    * @return the index of the first occurrence of the specified element in 
    *   this list, or -1 if this list does not contain the element 
    * @throws ClassCastException if the type of the specified element 
    *   is incompatible with this list 
    *   (<a href="Collection.html#optional-restrictions">optional</a>) 
    * @throws NullPointerException if the specified element is null and this 
    *   list does not permit null elements 
    *   (<a href="Collection.html#optional-restrictions">optional</a>) 
    */ 
    int indexOf(Object o);