2016-05-24 2 views
0

Мне было интересно, как реализуется метод indexOf ArrayList. На самом деле у меня есть переопределить метод Equals так:[Java] Использует ли indexOf равные?

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

я, хотя это позволит избежать меня переопределить также метод IndexOf но, кажется, я совершенно неправильно. Когда я пытаюсь

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

IndexOf возвращает ложь, но она должна возвращать верно. (Я проверил элемент, который я ищу)

Я совершенно не прав?

+0

* «Мне было интересно, как метод IndexOf из ArrayList реализован» * Вам не нужно знать, как это * реализовано *, что вам нужно знать, что такое контракт. Для этого есть инструмент: [JavaDoc] (http://docs.oracle.com/javase/8/docs/api/java/util/List.html#indexOf-java.lang.Object-), в котором говорится: * "Возвращает индекс первого вхождения указанного элемента в этом списке или -1, если этот список не содержит элемент. Более формально возвращает самый низкий индекс i, такой что' (o == null? Get (i) == null: o.equals (get (i))), или -1, если такого индекса нет. * * –

ответ

4

equals никогда не должна возвращать верно, когда сравниваемые объекты не одного и того же типа (в вашем случае CustomObject «s equals всегда должен возвращать ложь, когда o не является экземпляром CustomObject).

Реализация indexOf происходит использовать String «s equals вместо ваших CustomObject» S equals при передаче String к нему, и String «S equals возвращает ложь, когда вы передаете ей объект, который не является String.

Кроме того, не используйте == в сравнении со строками.

Вы должны передать экземпляр CustomObject в indexOf:

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

(или любой другой конструктор CustomObject выглядит)

Ваш метод equals должен выглядеть следующим образом:

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

Вы правы! Должен ли я переопределить значение String? – user1315621

+1

@ user1315621 Нет, вы не можете. Строка - последний класс. – Eran

+0

Спасибо. Так что это ужасная практика. Я избегу этого. Благодаря! – user1315621

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

Это то, что вы делаете неправильно. Вы ищете индекс String внутри списка объектов CustomObject.

Из ява документы:

/** 
    * 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); 
Смежные вопросы