首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出Java中整数的多个HashSet中所有没有重复的元素

找出Java中整数的多个HashSet中所有没有重复的元素
EN

Stack Overflow用户
提问于 2012-12-08 22:21:11
回答 7查看 1.3K关注 0票数 5

Integers的多个HashSet中,我想要得到所有这些元素,它们没有重复。即,其仅在所有HashSet的联合中出现一次。我不能以编程的方式对其进行概念化。

例如,假设第一个集合包含{2,4,6,8,9},第二个集合包含{2,8,9},第三个集合包含{2,4,8,9}。在所有这些集合中,元素6只出现一次。

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-12-08 22:33:14

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

代码语言:javascript
复制
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

示例用法:

代码语言:javascript
复制
Set<Integer> set1, set2, set3;
...
Set<Integer> u = unique(set1, set2, set3);

评估示例:

为例,假设第一个集合包含{2,4,6,8,9},第二个集合包含{2,8,9},第三个集合包含{2,4,8,9}。在所有这些集合中,元素6只出现一次。

  • 在第一个内循环完成后,once包含{ 2,4,6, 8,9},并且twice为空。添加第二个集合的
  • :2,8和9已经在代码集中,因此它们被添加到代码集现在是{2,4,6,8,9},代码现在是第三个集合:2被重新添加到< once >d19twice >,4被添加到< twice >d20,8,9被重新添加到twice.
  • once现在是{2,4,6,8,9} (所有集合的并集),twice现在是{2,4,8,9} (至少出现来自once的twice).
  • remove twice的元素。once现在是{6}。返回once.
票数 4
EN

Stack Overflow用户

发布于 2012-12-08 22:36:31

您可以使用contains()方法来完成此操作。首先,从所有其他集合创建一个新的HashSet。然后遍历这个集合,并检查其他集合是否contains()指定的元素。如果有两个或更多的列表包含它,那么您就有了一个副本,并且可以continue。例如,如果只有一个集合包含元素,则可以将其存储在不同的结果集中。

我编写了一个实用方法来实现您所需的功能:

代码语言:javascript
复制
public static <E> HashSet<E> uniques(HashSet<E>... sets){
    HashSet<E> everything = new HashSet<E>();
    for(HashSet<E> set : sets){
        everything.addAll(set);
    }
    HashSet<E> uniques = new HashSet<E>();
    for(E e : everything){
        int count = 0;
        for(HashSet<E> set : sets){
            if(set.contains(e)){
                count++;
            }
            if(count > 1){
                break;
            }
        }
        if(count == 1){
            uniques.add(e);
        }

    }
    return uniques;
}
票数 1
EN

Stack Overflow用户

发布于 2012-12-09 00:28:11

使用中间MultisetGuava版本

代码语言:javascript
复制
@SafeVarargs
public static <E> Set<E> uniqueElements(Set<? extends E>... sets) {
    final Multiset<E> multiset = HashMultiset.create();
    for (Set<? extends E> set : sets) {
        multiset.addAll(set);
    }
    return Sets.filter(multiset.elementSet(), new Predicate<E>() {
        @Override
        public boolean apply(E element) {
            return multiset.count(element) == 1;
        }
    });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13778320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档