6

私のコードには、2 つのリストを比較し、最初のリストから、2 番目のリストに存在するオブジェクトを削除する必要があるシナリオがあります。「removeAll」オブジェクトがリストに対してどのように機能するかに似ています。リストはカスタム オブジェクトで作成されているため、removeAll メソッドは機能しません。

これを機能させるためにさまざまな方法を試しました: - リストを構成するカスタム オブジェクトに equals() と hashCode を実装 - カスタム オブジェクトに Comparable インターフェイスを実装 - カスタム オブジェクトに Comparator インターフェイスを実装

Apache Common の CollectionUtils および ListUtils メソッド (subtract、intersect、removeAll) を使用してみました。どれも機能していないようです。

カスタムの削除コードを書く必要があるかもしれないことは理解しています。しかし、それを行う方法がわかりません。私が正しい方向に進むのを助ける指針は本当に高く評価されます.

ありがとう、ジェイ

4

4 に答える 4

14

Java コレクションは、すでにシナリオに対応しています。を呼び出すCollection.removeAll(Collection)と、メソッドを使用して渡されたコレクションからすべての項目が削除されequals()、等しいかどうかがテストされます。

List<String> list1 = new ArrayList<String>();
Collections.addAll(list1, "one", "two", "three", "four");
List<String> list2 = new ArrayList<String>();
Collections.addAll(list2, "three", "four", "five");
list1.removeAll(list2); // now contains "one", "two"

これを機能させるには、保存しているオブジェクトに equals/hashCode コントラクトを適切に実装する必要がありaますb

a.equals(b) == b.equals(a)

と:

a.hashCode() == b.hashCode() if a.equals(b)

不適切に定義された equals および hashCode メソッドは、未定義の動作を作成し、コレクション関連の問題の一般的な原因です。

于 2010-04-11T14:40:06.960 に答える
6

カスタムオブジェクトでメソッドを機能させるにはequalshashCodeメソッドをオーバーライドするだけで十分です。removeAll

適切な方法でそれらをオーバーライドしなかった可能性があります。いくつかのコードが大いに役立ちます。

于 2010-04-11T14:44:09.700 に答える
4

あなたが言った:

... リストはカスタム オブジェクトで作成されているため、removeAll メソッドは機能しません。

他の人が述べているように、.removeAll() は、適切に実装された equals() および hashCode() を含む、Java Collections がそのオブジェクトに期待する契約に従う限り、カスタム オブジェクトであっても、説明したシナリオで機能するはずです。方法。

これを機能させるためにさまざまな方法を試しました: - リストを構成するカスタム オブジェクトに equals() と hashCode を実装 - カスタム オブジェクトに Comparable Interface を実装 - カスタム オブジェクトに Comparator Interface を実装 ...

あなたはさまざまなアプローチを試しているように思えます: 1 つをコーディングして、それを試して、すぐに別のアプローチをコーディングして、それを試して、さらに別のアプローチをコーディングして… ペースを落として、各アプローチが失敗した理由を理解しようとすること、および/または決定することは価値があります。次に進む前に、なぜそのアプローチがあなたの状況でうまくいかないのか. 各アプローチが機能しない理由を既に調査して判断している場合は、質問で説明してください。まだお持ちでない場合は、コードを投稿してお手伝いさせてください。

ほとんどの人は、最初のアプローチ (.removeall()) が機能するはずであり、カスタム オブジェクトが関係しているため、この StackOverflow の質問を簡単に確認して、何かが飛び出すかどうかを確認してください。

Java で equals と hashCode をオーバーライドする

「Java クラスで equals と hashCode をオーバーライドする場合、どのような問題や落とし穴を考慮する必要がありますか?」

于 2010-04-11T15:20:50.440 に答える
0

私は彼の最初の発言が真実であることを発見した. removeAll は、反復子で remove をオーバーライドした場合にのみ自動的に機能します。コレクションの削除をオーバーライドするだけでは十分ではありません。なぜなら、removeAll (および clear とretainAll) はすべて反復子を使用して機能するからです。イテレーターの remove を除いて、イテレーターを使用している間は基になるコレクションを変更してはならないため、イテレーターで remove をオーバーライドしないと、removeAll、clear、retainAll は機能しません。イテレータ内の remove メソッドで UnsupportedOperationException をスローすると、説明した 3 つのメソッドのいずれかを呼び出すと、それが表示されます。

于 2013-10-13T15:49:38.490 に答える