2011-10-30 74 views
2

我嘗試了下面的簡單測試。使用與indexOf類似的工具

class ZiggyTest{ 
    public static void main(String[] args){ 

     List<Cities> cities3 = new ArrayList<Cities>(); 
     Cities city = new Cities("London"); 

     cities3.add(new Cities("Manchester")); 
     cities3.add(new Cities("Glasgow")); 
     cities3.add(new Cities("Leeds")); 
     cities3.add(city); 
     cities3.add(new Cities("Leicester")); 
     cities3.add(new Cities("Croydon")); 
     cities3.add(new Cities("Watford")); 

     System.out.println("IndexOf(new Croydon) " 
         + cities3.indexOf(new Cities("Croydon"))); 
     System.out.println("IndexOf(city) " 
         + cities3.indexOf(city)); 
    } 
} 

class Cities implements Comparable<Cities>{ 
    String title; 

    Cities(String aTitle){ 
     this.title = aTitle; 
    } 

    public String getTitle(){ 
     return title; 
    } 

    public String toString(){ 
     return "Title : " + title; 
    } 

    public int compareTo(Cities c){ 
     return title.compareTo(c.getTitle()); 
    } 
} 

上述測試的輸出是

IndexOf(new Croydon) -1 
IndexOf(city) 3 

我明白爲什麼第二行製備3,但我不理解爲什麼第一行沒有找到新的具有標題=」克羅伊登」。

的API描述爲一個

返回指定元件的第一次出現的索引在此列表中,或-1,如果該列表不包含該元素的indexOf方法。更正式地說,如果沒有這樣的索引,則返回最低索引i,即(o==null ? get(i)==null : o.equals(get(i)))-1

我認爲API是說如果對象爲null,那麼它將返回列表中第一個出現空對象的索引。如果它不爲null,它將返回傳入的對象等於方法返回true的第一次出現的索引。

不應該創建爲cities3.indexOf(new Cities("Croydon")的對象是否等於之前添加的對象cities3.add(new Cities("Croydon"));

+2

也許這是Java想忘記克羅伊登的願望?真的不能指責它......(請參閱mishadoff對於真正的解決方案的回答,但作爲一個老惠特吉,我無法抗拒......) –

+0

哈哈很有趣:) – ziggy

回答

9

重新定義equals而不是compareTo如果您要執行搜索操作。

默認情況下,indexOf使用equals操作進行比較,在您的情況下,equals不重新定義,這意味着您通過引用進行比較。當你用相同的名字創建新的City對象時,你有另一個對象的引用,所以equals返回false。

P.S.如果您使用的是描述城市的對象,那麼城市的名稱不適用於城市

+1

確實。定義一個'equals()'覆蓋將解決'indexOf()'問題。 @ziggy:請注意,您不能覆蓋'equals()'而不覆蓋'hashCode()'。如果你沒有這樣做,那麼「違反equals()」的對象必須具有相同的'hashCode()'「要求。 – Barend

+0

謝謝。 compareTo()會在什麼情況下有用呢?我認爲它會工作,因爲字符串不會覆蓋equals()。 – ziggy

+0

compareTo()當您不按自然順序執行排序操作時,或者在使用SortedSet時有用。字符串覆蓋等於,但你的班級城市不是。 – mishadoff