1

リスト SomeList に thatObj が含まれていることがわかっているとします。次のコードは、someList から thatObj への参照を削除しますか?

SomeClass el = (SomeClass) thatObj.clone();
SomeList.remove(el);

このメソッドが何らかの方法でオブジェクトを比較すると、参照を介して見つけることができません。直感的には、参照が同じオブジェクトを指している場合に true を返す Object.equals を使用する必要があるため、このコードは機能しません。

そうでない場合、追加の質問: 参照を持っていないが、問題のオブジェクトのすべてのメンバーを知っている場合、リストから削除する方法は?

4

4 に答える 4

1

このメソッドが何らかの方法でオブジェクトを比較すると、参照を介して見つけることができません。直感的には、参照が同じオブジェクトを指している場合に true を返す Object.equals を使用する必要があるため、このコードは機能しません。

はい、あなたは正しいです。

そうでない場合、追加の質問: 参照を持っていないが、問題のオブジェクトのすべてのメンバーを知っている場合、リストから削除する方法は?

2 つの可能性:

  • クラスの equals メソッドをオーバーライドし、すべての既知のメンバーで新しいインスタンスを作成しcall、新しく作成されたインスタンスをパラメーターとして渡すことを削除します
  • リスト内のすべてのオブジェクトを反復処理し、値と等しいメンバーを持つオブジェクトを削除します
于 2013-11-01T17:17:58.163 に答える
1

removeメソッドは、メソッドを内部的に使用equalsして、リスト内のオブジェクトをチェックします。equal が true を返す場合、それは削除されます。メソッドをオーバーライドするequalsと、オブジェクトを適切に削除できます。参考までに、ArrayList remove メソッドのコードを次に示します。

 public boolean remove(Object o) {
    if (o == null) {
            for (int index = 0; index < size; index++)
        if (elementData[index] == null) {
            fastRemove(index);
            return true;
        }
    } else {
        for (int index = 0; index < size; index++)
        if (o.equals(elementData[index])) {
            fastRemove(index);
            return true;
        }
        }
    return false;
    }
于 2013-11-01T17:18:03.430 に答える
0

クラスの equals メソッドをオーバーライドします。ここにjavadocがあります。また、Java equals() メソッドの癖オーバーライドおよび Java での equals と hashCode のオーバーライドも参照してください。

于 2013-11-01T17:15:23.853 に答える
0

インデックスを返すことでリストを検索してメンバーを見つけ、オブジェクトを取得して削除します。インデックスで削除することもできます。コード

SomeList.indexOf() 

equals()およびをオーバーライドするオブジェクトのインデックスを取得するのに役立ちますhashCode()

于 2013-11-01T17:18:16.890 に答える