' P '

whatever I will forget

Java ClassのArrayListでのindexOf()でハマった話

なんで-1がかえってくるの!?と小一時間悩んでようやく解決しました

自分が書いたコードは下記
例えばDataクラスに実データが格納されて、TestクラスにDataクラスのArrayListを持つ場合。
そしてmainクラスからobjをTestクラスのArrayListにaddしてArrayListのindexが欲しい場合。

public class Data {
    private String data1;
    private String data2;
// omitted
// コンストラクタはdata1,2の両方とdata1のみを定義する
// getterはそれぞれ定義
}
public class Test{
    private ArrayList<Data> arrayData = new ArrayList<Data>();
// omitted
    public void addData(Data dataObj) {
        arrayData.add(dataObj);
    }
    public int returnIndex(Data dataObj) {
        return this.arrayData.indexOf(dataObj);
    }
//omitted
}
public class void main(String[] args) {
    Test theTest = new Test();
    //omitted
    String test1 = "aaa";
    String test2 = "bbb";
    Data dataA = new Data(test1, test2);
    addData(dataA);

    String data1 = "aaa";
    Data dataB = new Data(data1);
    int i = returnIndex(dataB);
    System.out.println(i); 
    //omitted
} 

上記じゃiは-1しか返って来ません、、、
これは完全一致するobjがないので(dataBはdata1しかデータを作っていないので)-1しか返って来ません

解決策

こんな場合でもなんとかしてindexを返す方法は下記にTestクラスのreturnIndexメソッドを変更

public class Test{
    private ArrayList<Data> arrayData = new ArrayList<Data>();
// omitted
    public void addData(Data dataObj) {
        arrayData.add(dataObj);
    }
    public int returnIndex(Data dataObj) {
//        return this.arrayData.indexOf(dataObj);
        return arrayData.getData1().equals(dataObj.getData1());

なんかクソややこしくなったのですがここまでやれば-1以外が返りました。
obj同士の正しいメンバ同士で比較させてあげればいいっぽいですね...
片方はメンバ2つあって片方はメンバ1つしか値がセットされていないとindexOfは-1を返すということが学べました。