私はこれらの答えがトリックを逃していると思います。
Blochは、彼の本質的で、素晴らしく、簡潔な効果的なJavaで、項目47のタイトル「ライブラリを知って使用する」、「要約すると、車輪の再発明をしないでください」と述べています。そして、彼はいくつかの非常に明確な理由を挙げています。
ここにはCollectionUtils
、Apache Commons Collectionsライブラリのメソッドを提案するいくつかの回答がありますが、この質問に答える最も美しくエレガントな方法を見つけたものはありません。
Collection<Object> culprits = CollectionUtils.disjunction( list1, list2 );
if( ! culprits.isEmpty() ){
// ... do something with the culprits, i.e. elements which are not common
}
犯人:すなわち、両方に共通ではない要素Lists
。とを使用すると、どの犯人がどの犯人に属し、どの犯人に属するかを判断list1
するのlist2
は比較的簡単です。ただし、{"a"、 "a"、 "b"}と{"a"、 "b"、 "b"}のような場合は、これがソフトウェアの障害ではないことを除いて、
バラバラになる傾向があります。目的のタスクの微妙さ/あいまいさの性質に固有です。CollectionUtils.intersection( list1, culprits )
CollectionUtils.intersection( list2, culprits )
disjunction
Apacheエンジニアによって作成されたこのようなタスクについては、いつでもソースコード(l。287)を調べることができます。彼らのコードを使用することの利点の1つは、多くのエッジケースや落とし穴が予想され、対処されて、徹底的に試行およびテストされていることです。必要に応じて、このコードをコピーして心ゆくまで微調整できます。
NB私は最初、CollectionUtils
どのメソッドもオーバーロードされたバージョンを提供せず、独自のバージョンを課すことができることに失望しましたComparator
(したがってequals
、目的に合わせて再定義できます)。
しかし、collections4 4.0から、Equator
「タイプTのオブジェクト間の同等性を決定する」新しいクラスがあります。collections4 CollectionUtils.javaのソースコードを調べると、いくつかのメソッドでこれを使用しているようですが、私が理解できる限り、これはファイルの先頭にあるCardinalityHelper
クラスを使用するメソッドには適用できません...インクルードdisjunction
とintersection
。
Apacheの人々は、それが自明ではないため、まだこれに慣れていないと思います。「AbstractEquatingCollection」クラスのようなものを作成する必要があります。このクラスは、その要素の固有equals
のhashCode
メソッドを使用する代わりに、それらを使用する必要があります。 、などのEquator
すべての基本的なメソッドの。実際、ソースコードを見ると、NBは実装されておらず、そのような抽象サブクラスも実装されていません。実装されています。かなりの頭痛。add
contains
AbstractCollection
add
AbstractSet
HashSet
ArrayList
add
その間、この空間を見てください。明らかな暫定的な解決策は、すべての要素を特注のラッパークラスでラップし、必要な種類の同等性を使用equals
しhashCode
て実装することです...次にCollections
、これらのラッパーオブジェクトを操作します。