在Java中查找多个HashSet of Integers中没有重复的所有元素

Rav*_*shi 5 java set

在多HashSetIntegers我想所有这些因素,其中有没有重复的.也就是说,它只在所有的联合中出现过一次HashSet.我无法以编程方式对其进行概念化.

例如,考虑set首先包含{2,4,6,8,9},第二个包含{2,8,9},第三个包含{2,4,8,9}.在所有这些集合中,元素6仅出现一次.

如何在Java中找到多个HashSet of Integers中没有重复的所有元素?

Joh*_*rak 5

您可以保存至少出现一次且至少出现两次的元素集.这是一个手动循环,但它是可能的.这将适用于任意数量的集合,并且不会修改输入:

public static Set<E> unique(Set<? extends E>... sets){
   Set<E> once = new HashSet<E>();
   Set<E> twice = new HashSet<E>();

   for(Set<? extends E> set:sets){
      for(E el:set){
         if(once.contains(el)){
            twice.add(el);
         } else {
            once.add(el);
         }
      }
   }

   once.removeAll(twice);
   return once;
} 
Run Code Online (Sandbox Code Playgroud)

Ideone:http://ideone.com/reGDBy

用法示例:

Set<Integer> set1, set2, set3;
...
Set<Integer> u = unique(set1, set2, set3);
Run Code Online (Sandbox Code Playgroud)

评估示例:

例如,考虑set首先包含{2,4,6,8,9},第二个包含{2,8,9},第三个包含{2,4,8,9}.在所有这些集合中,元素6仅出现一次.

  • 第一个内循环完成后,once包含{2,4,6,8,9}并twice为空.
  • 添加第二组:2,8和9已经在once集合中,因此它们被添加到twice集合中.
  • once现在是{2,4,6,8,9},twice现在是{2,8,9}.
  • 从第三组开始:2重新加入twice,4加twice,8,9重新加入twice.
  • once现在是{2,4,6,8,9}(所有集合的联合),twice现在是{2,4,8,9}(元素至少出现两次).
  • twice从中移除once.once现在是{6}.返回once.