自分で作ったクラスのオブジェクトを入れたArrayListでindexOfを使う方法
自分で作ったクラスのオブジェクトを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)); } }
とこんな感じ。