2013-09-05 5 views
80

の違いだから私は2セット持っている場合:取得二組

Set<int> test1 = new HashSet<Integer>(); 
test1.add(1); 
test1.add(2); 
test1.add(3); 

Set<int> test2 = new HashSet<Integer>(); 
test2.add(1); 
test2.add(2); 
test2.add(3); 
test2.add(4); 
test2.add(5); 

それらを比較してわずか4と5のセットが返さを持ってする方法はありますか?

+0

可能な複製http://stackoverflow.com/questions/8064570/what-is-the-best-way-get-the-symmetric-difference-between-two-sets-in-java –

+9

これは可能ではありません正確な重複:対称の差異と差異は同じではありません。 –

+0

'test1'に' 6'が含まれていれば、答えは4,5,6でしょうか?あなたが対称的な差異をしたいのですか?http://en.wikipedia.org/wiki/Symmetric_difference –

答えて

110

この

test2.removeAll(test1); 

Set#removeAll

を試してみて、このセットから、指定されたコレクション(任意のオペレーション)に含まれるすべての要素を削除します。指定されたコレクションがセットでもある場合、この操作はこのセットを効果的に変更して、その値が2つのセットの非対称セット差になるようにします。

+20

これはうまくいくでしょうが、それはいいと思いますユニオンのような設定操作を持つ機能、Javaで構築された違い。上記の解決策はセットを修正しますが、多くの状況では実際にはそうしたくありません。 –

+41

Javaが 'union'、' intersection'または 'difference'を定義していないときに、このデータ構造を' Set'と呼ぶ方法はありますか? –

+6

この解決策は完全には正しくありません。 test1とtest2の順序が異なるためです。 –

11

はい:

test2.removeAll(test1) 

これはtest2を変異させるので、あなたはそれを維持するために必要がある場合は、コピーを作成しますが。

また、<int>の代わりに<Integer>を指定したとします。

5

は、Java 8を使用している場合、あなたはこのような何かを試みることができる:あなたはグアバ(旧Googleのコレクション)ライブラリを使用する場合解決策がある

public Set<Number> difference(final Set<Number> set1, final Set<Number> set2){ 
    final Set<Number> larger = set1.size() > set2.size() ? set1 : set2; 
    final Set<Number> smaller = larger.equals(set1) ? set2 : set1; 
    return larger.stream().filter(n -> !smaller.contains(n)).collect(Collectors.toSet()); 
} 
+4

@Downvoter:おそらく、あなたは、他の答えがどのセットがより大きいかをチェックしないことに気づいていないかもしれません...したがって、より大きな 'Set'からより小さい' Set'を減算しようとするなら、異なる結果が得られます。 –

+20

あなたは、その関数のコンシューマが常に小さい方の集合を減算したいと仮定しています。差異の設定は反共的です(http://en.wikipedia.org/wiki/Anticommutativity)。 A-B!= B-A – Simon

+5

どのような違いを実装していても、 'public static Set 差(final Set set1、final set set2){'を署名として使用すると、メソッドは汎用ユーティリティ関数として使用できます。 – kap

71

を:

SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1); 

SetViewが返されるのはSetです。これはライブ表現で、不変または別のセットにコピーすることができます。 test1およびtest2はそのまま残る。

+0

[注文](https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Sets.html#difference(java.util.Set、%20java .util.Set))test2とtest1の問題の。 [symmetricDifference()](https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Sets.html#symmetricDifference(java.util.Set、%、 20java.util.Set))ここで、順序は関係ありません。 – datv

関連する問題