2011-10-30 13 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を生産している理由を私は理解しますが、最初の行がタイトルで新しいものを見つけていない理由を私は理解していないですクロイドン "。 1

ことは、このリストで指定された要素が最初に出現する位置のインデックスを返しますよう、または-1このリストは要素が含まれていない場合

APIはindexOf方法について説明します。より正式には、そのようなインデックスがない場合、(o==null ? get(i)==null : o.equals(get(i)))、または-1のような最小インデックスiを返します。

オブジェクトがnullの場合、nullオブジェクトの最初のオカレンスのインデックスをリストから返します。 nullでない場合は、渡されたオブジェクトequalsメソッドがtrueを返す最初のオカレンスのインデックスを返します。

cities3.indexOf(new Cities("Croydon")として作成されたオブジェクトは、以前に追加されたオブジェクトと同じでなければなりません。cities3.add(new Cities("Croydon"));

+2

おそらく、JavaがCroydonを忘れたいのですか?本当にそれを責めることはできません...(実際の解決策についてはmishadoffの答えを参照してください、しかし、古いWhitgiftianとして、私は抵抗することができませんでした...) –

+0

haha​​非常に面白い:) – ziggy

答えて

9

検索操作を実行する場合は、compareToの代わりにequalsを再定義してください。

デフォルトでは、indexOfはequals演算を使用して比較しますが、あなたのケースでは再定義されていないということは、参照による比較があることを意味します。同じ名前の新しいCityオブジェクトを作成すると、objectへの別の参照があるため、equalsはfalseを返します。

P.S.あなたが都市を表すオブジェクトを使用している場合、クラスの望ましい名前都市でない都市

+1

確かに。 'equals()'オーバーライドを定義すると 'indexOf()'の問題が解決されます。 @ziggy: 'hashCode()'もオーバーライドしないで 'equals()'をオーバーライドすることはできないことに注意してください。あなたがそれをしなければ、 "equals()"に等しい等価のオブジェクトは、同じhashCode()を必要とします。 " – Barend

+0

ありがとうございます。 compareTo()はどんな状況で役に立ちますか? Stringはequals()をオーバーライドするので、動作すると思っていました。 – ziggy

+0

compareTo()自然な順序でないソート操作を実行するとき、またはソートセットを使用しているときに便利です。文字列のオーバーライドは等しいが、あなたのクラスのCityはそうではありません。 – mishadoff

関連する問題