これらの答えはトリックを逃すと思います。
Blochは、彼の本質的で素晴らしい、簡潔なEffective 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
使用して比較的簡単であるCollectionUtils.intersection( list1, culprits )
とCollectionUtils.intersection( list2, culprits )
。
ただし、{"a"、 "a"、 "b"} disjunction
と{"a"、 "b"、 "b"} ...のような場合は、ソフトウェアの障害ではなく、望ましいタスクの微妙さ/あいまいさの性質に固有です。
Apacheエンジニアが作成した、このようなタスクのソースコード(l。287)はいつでも調べることができます。それらのコードを使用する利点の1つは、多くのエッジケースと問題が予想され、対処された状態で、徹底的に試行およびテストされていることです。必要に応じて、このコードをコピーして心ゆくまで調整できます。
注意:最初にがっかりしたのCollectionUtils
は、どのメソッドにも独自のルールを課すことができるオーバーロードバージョンが用意されていないことですComparator
(そのためequals
、目的に合わせて再定義できます)。
しかし、collections4 4.0からは、Equator
「T型のオブジェクト間の等価性を決定する」新しいクラスがあります。collections4 CollectionUtils.javaのソースコードを調べると、いくつかのメソッドでこれを使用しているようですが、私が知る限り、CardinalityHelper
クラスを使用してファイルの上部にあるメソッドには適用できません... disjunction
およびを含めますintersection
。
私はそれが非自明であるため、Apacheの人々は、まだこの程度持っていないと推測:あなたの代わりにその要素の固有の使用の「AbstractEquatingCollection」クラス、のようなものを作成しなければならないequals
とhashCode
メソッドを代わりにそれらを使用する必要がありますが以下のEquator
ようなすべての基本的な方法についてadd
、contains
などNBはあなたがソースコードを見ると、実際には、AbstractCollection
実装されていないadd
、また、このようなとしての抽象サブクラスを行うAbstractSet
...あなたのような具象クラスまで待たなければならないHashSet
とArrayList
前にadd
実装されています。かなり頭痛の種。
とりあえず、このスペースを見てください。明白な暫定的な解決策は、用途ラッパークラス特注内のすべての要素をラップするだろうequals
し、hashCode
それから...あなたが望む平等の種類を実装するための操作Collections
これらのラッパーオブジェクトの。