読者です 読者をやめる 読者になる 読者になる

自分で作ったクラスのオブジェクトを入れたArrayListでindexOfを使う方法

Java

自分で作ったクラスのオブジェクトをArrayListに入れて
indexOfでそのオブジェクト内のString検索しかったので自分の作ったクラスでequalsメソッドをオーバーライドする。
悩んだところは、

  • Objectのequalsメソッドをオーバーライドしてる
  • ArrayList.indexOf()のカッコの中の変数。

equalsメソッド

これはJavaAPIを見ればわかるようにindexOfはObjectのequalsメソッドを使用しているので
書き代えてやればよい。

class Term{
public boolean equals(Object obj){
Test t = (Test)t;
if(s.equals(t.s)) return true;
else false;
   }
}

ArrayList.indexOfを実装してみたが

最初は
ArrayList.indexOf(String s);
でやっていたのだが帰ってくるのはオールゼロ..

なぜだ・・と小一時間悩む

原因

indexOf

public int indexOf(Object elem)

equals メソッドを使って等しいかどうかを判定しながら、指定された引数と同じ内容の要素を先頭から検索します。

定義:
インタフェース List 内の indexOf
オーバーライド:
クラス AbstractList 内の indexOf

パラメータ:
elem - オブジェクト
戻り値:
リスト内で引数が最初に現れるインデックス。オブジェクトが見つからない場合は -1
関連項目:
Object.equals(Object)

関連項目を見るにObjectのequalsを使っている。
つまりArrayList(String)で検索するとString.equals()が使われてる!

結論

ArrayList.indexOf(Term t);
でOK!

簡単に(?)表すと

class Myclass{
String s;
Vector v;

Myclass(String s){
 this.s = s;
}
...

.....

public boolean equals(Object obj){
	    Myclass t = (Myclass)obj;
	    String ts = t.s;

		if(s.equals(ts)) return true;
		else return false;
	}


}

class Test{

public static void main(String[] args){
ArrayList al = new ArrayList<Myclass>();
Myclass mc = new Myclass("test");

al.add(mc);

Myclass mc2 = new Myclass("test");
System.out.println(al.indexOf(mc2));

}

}


とこんな感じ。