我想在HashSet的多个Integers中获取所有这些元素,这些元素没有重复项。即所有HashSet的并集仅出现一次。我无法通过编程将其概念化。
例如,考虑一组首先包含{2,4,6,8,9},第二组包含{2,8,9},第三组包含{2,4,8,9}。在所有这些集合中,元素6仅出现一次。如何在Java的多个Integer HashSet中查找所有没有重复的元素?

最佳答案

您可以保存至少发生一次且至少发生两次的元素集。这是一些手动循环,但有可能。这将适用于任意数量的差异集,并且不会修改输入:

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;
}

Ideone:http://ideone.com/reGDBy

用法示例:
Set<Integer> set1, set2, set3;
...
Set<Integer> u = unique(set1, set2, set3);

评估示例:


  • 第一个内部循环完成后,once包含{2,4,6,8,9},而twice为空。
  • 添加第二组:once集中已经有2、8和9,因此它们被添加到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中删除onceonce现在为{6}。返回once
  • 09-26 03:43