- ベストアンサー
独自クラスをVectorに格納してindexOfで検索する方法
ewuals(myclass)、ewuals(int)とhash()を実装した、自分で作成したクラスがあります。 そのクラスをVectorに格納して、indexOf()やlastIndeOf()で検索しようとしていますが、-1が返されます。 for()ループとequals()を使用して自分で検索すると、意図した値が帰ってくるのですが。どこがいけないのでしょうか? ===>java -version java version "1.6.0_11" Java(TM) SE Runtime Environment (build 1.6.0_11-b03) Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing) import java.util.Vector; ===>type equaltest.java class equaltest { public static void main(String args[]) { myclass myc[] = new myclass[8]; myc[0] = new myclass(false, 10 , 3); myc[1] = new myclass(false, 10 , 4); myc[2] = new myclass(false, 20 , 3); myc[3] = new myclass(false, 20 , 4); myc[4] = new myclass(true, 10 , 3); myc[5] = new myclass(true, 10 , 4); myc[6] = new myclass(true, 20 , 3); myc[7] = new myclass(true, 20 , 4); //Vectorに追加 Vector<myclass> myVec = new Vector<myclass>(); for (int lp1 = 0; lp1<myc.length;lp1++){ myVec.add(myc[lp1]); } //Vectorの中身を表示 System.out.println(myVec.toString()); System.out.println("------------"); System.out.println("Vector.indexOfの返す値は・・・"); System.out.println("10\t:"+myVec.indexOf(10)); System.out.println("20\t:"+myVec.indexOf(20)); System.out.println("3\t:"+myVec.indexOf(3)); System.out.println("4\t:"+myVec.indexOf(4)); myclass mytmp = new myclass(true, 20 , 4); //mytmpの中身を表示 System.out.println(mytmp.toString()); System.out.println("mytmp\t:"+myVec.indexOf(mytmp)); System.out.println("自分でequals比較すると・・・"); System.out.println("mytmp?2\t:"+mytmp.equals(myc[2])); System.out.println("mytmp?3\t:"+mytmp.equals(myc[3])); System.out.println("mytmp?4\t:"+mytmp.equals(myc[4])); System.out.println("mytmp(10):"+mytmp.equals(10)); System.out.println("mytmp(20):"+mytmp.equals(20)); System.out.print("自分でVectorを検索すると・・・["); for (int lp1 = 0; lp1<=myVec.size();lp1++){ if(lp1 == myVec.size()){ System.out.println("-1(not found)]"); break; } if(mytmp.equals((myclass)(myVec.elementAt(lp1))) == true){ System.out.println("" + lp1 + "]"); break; } } } } ===>type myclass.java public class myclass{ boolean flg; int valurT; int valurF; // myclass(){ flg = false; valurT = 20; valurF = 5; } myclass(boolean af, int avalurT, int avalurF){ flg = af; valurT = avalurT; valurF = avalurF; } // public boolean equals(int myArg){ if(flg){ return (valurT == myArg); }else{ return (valurF == myArg); } } // public boolean equals(myclass argmycls){ if(flg){ return (valurT == argmycls.valurT); }else{ return (valurF == argmycls.valurF); } } public String toString(){ return "[flg:"+flg+" valurT:"+valurT+" valurF:"+valurF+"]"; } public int hashCode(){ if(flg){ return (valurT); }else{ return (valurF); } } }
- みんなの回答 (4)
- 専門家の回答
お礼
ありがとうございました。equals(Object) を改良する必要があります、というのは予想外でした。 以下の関数を追加して実装したら、myclass 同士の比較はうまくいくようになりました。 public boolean equals(Object obj) { if(obj instanceof Integer) { int i = ((Integer)obj).intValue(); return(this.equals(i)); }else if (obj instanceof myclass) { myclass myc = ((myclass)obj); return(this.equals(myc)); } return super.equals(obj); }