Java中两组的对称差异

时间:2012-03-14 09:01:22

标签: java collections set

我的应用中有两个TreeSet

set1 = {501,502,503,504}
set2 = {502,503,504,505}

我想得到这些集合的symmetric difference,以便我的输出为集合:

set = {501,505}

7 个答案:

答案 0 :(得分:24)

你在symmetric difference之后。这在Java tutorial中进行了讨论。

Set<Type> symmetricDiff = new HashSet<Type>(set1);
symmetricDiff.addAll(set2);
// symmetricDiff now contains the union
Set<Type> tmp = new HashSet<Type>(set1);
tmp.retainAll(set2);
// tmp now contains the intersection
symmetricDiff.removeAll(tmp);
// union minus intersection equals symmetric-difference

答案 1 :(得分:11)

您可以使用CollectionUtils#disjunction

编辑:

或者使用较少的Java-5之前的版本,请使用Guava Sets#symmetricDifference

答案 2 :(得分:3)

那些寻找set subtraction/complement(非对称差异/分离)的人可以使用CollectionUtils.subtract(a,b)Sets.difference(a,b)

答案 3 :(得分:1)

使用retain all,删除all然后addAll来执行现有集合的联合。

  
      
  1. intersectionSet.retainAll(set2)// intersectionSet是set1
  2. 的副本   
  3. set1.addAll(SET2); //做一个set1和set2的联合
  4.   
  5. 然后删除重复项set1.removeAll(intersectionSet);
  6.   

答案 4 :(得分:0)

Set<String> s1 = new HashSet<String>();
    Set<String> s2 = new HashSet<String>();
    s1.add("a");
    s1.add("b");
    s2.add("b");
    s2.add("c");
    Set<String> s3 = new HashSet<String>(s1);
    s1.removeAll(s2);
    s2.removeAll(s3);
    s1.addAll(s2);
    System.out.println(s1);

输出s1:[a,c]

答案 5 :(得分:0)

您可以从Eclipse Collections尝试Sets.symmetricDifference()

Set<Integer> set1 = new TreeSet<>(Arrays.asList(501,502,503,504));
Set<Integer> set2 = new TreeSet<>(Arrays.asList(502,503,504,505));
Set<Integer> symmetricDifference =
        Sets.symmetricDifference(set1, set2);

Assert.assertEquals(
        new TreeSet<>(Arrays.asList(501, 505)),
        symmetricDifference);

注意:我是Eclipse Collections的提交者。

答案 6 :(得分:0)

如果我们使用com.google.common.collect包,则我们可能会优雅地找到这样的对称差异:

    Set<Integer> s1 = Stream.of( 1,2,3,4,5 ).collect( Collectors.toSet());
    Set<Integer> s2 = Stream.of( 2,3,4 ).collect( Collectors.toSet());
    System.err.println(Sets.symmetricDifference( s1,s2 ));

输出将是: [1,5]