4

指定された が含まれてcontains()いても false を返すメソッドに問題があります。私のコードは次のとおりです。ArrayListObject

String [] transaction = dbConnection.getPendingTransaction(username);
if (!onlineConnection.getSentTransactionRequests().contains(transaction)) {
    onlineConnection.getSentTransactionRequests().add(transaction);

    String packet = "RTR" + "_" + transaction[0] + "_" + transaction[2] + 
                        "_" + transaction[3] + "_" + transaction[4];
    onlineConnection.send(packet);
}

Thread.sleep()私は繰り返しの間に試したので、ArrayList成功せずに熱心にロードされませんでした。

4

6 に答える 6

8

これに関しては、配列のhashCode()andequals()は少し壊れています (理由については長い別の議論です)。

考えられる回避策は、ArrayList<ArrayList<String>>代わりにを使用することですArrayList<String[]>。 のequals()メソッドは、ArrayList期待どおりになります。

例えば:

    ArrayList<String> l1 = new ArrayList<>();
    ArrayList<String> l2 = new ArrayList<>();
    l1.add("asdf");
    l2.add("asdf");
    ArrayList<ArrayList<String>> coll = new ArrayList<>();
    coll.add(l1);
    System.out.println(coll.contains(l2));

予想true通り

于 2012-11-13T12:46:06.237 に答える
1

問題はequals、配列が参照等価であると定義されていることです。つまり、同じ要素を含む 2 つの異なる配列は等しくありません ...equalsメソッドによると。

equals「トランザクション」オブジェクトが文字列の等価性に基づくようにする場合は、カスタム クラスを作成して を保持し、メソッドとメソッドをオーバーライドする必要がありString[]ます。equalshashcode


ちなみに、配列equals(Object)メソッドは「ちょっと壊れた」わけではありません。の定義されたセマンティクスはequals、配列オブジェクトが本質的に変更可能であるという事実を単に反映しています。

于 2012-11-13T12:53:35.927 に答える
1

getPendingTransaction と getSentTransactionRequests を調べて、同じ配列を返し、新しい配列を作成しないようにする必要があります。次に、デバッグして配列オブジェクト ID を探します。これが同じではなく、同じである必要がある (同じ要素が含まれている) 場合は、これの回避策を試してください (たとえば、コンパレータまたはリストなどを作成します)。

于 2012-11-13T12:43:26.790 に答える
0

を使用する必要がList<String[]>ある場合は、運が悪いequals()hashCode()、そう思われます......

オブジェクトを比較するメソッドを作成したほうがよいかもしれません

何かのようなもの

public static boolean stringArrayListEquals(List<String[]> list, List<String[]> list2) {
    if (list.size() != list2.size()) return false;
    for (int i = 0; i < list.size(); ++i){
        if (!Arrays.equals(list.get(i), list2.get(i)) return false;
    }
    return true;
}

をテストするにはcontains()、別のループが必要です...

List<List<String>>代わりに真剣に使用する必要がありますが。

于 2012-11-13T13:03:26.650 に答える
0

対象だからString [] transactionです。リストを呼び出すと、メソッドcontainsを使用して新しいオブジェクトを他のオブジェクトと比較しますequals。するように想像してください

new Object().equals(new Object())
于 2012-11-13T12:39:45.067 に答える