在Integers的多个HashSet中,我想要得到所有这些元素,它们没有重复。即,其仅在所有HashSet的联合中出现一次。我不能以编程的方式对其进行概念化。
例如,假设第一个集合包含{2,4,6,8,9},第二个集合包含{2,8,9},第三个集合包含{2,4,8,9}。在所有这些集合中,元素6只出现一次。
如何在Java中找到整数的多个HashSet中所有没有重复的元素?
发布于 2012-12-08 22:33:14
您可以保存至少出现一次和至少两次的元素集。这是一些手动循环,但这是可能的。这将适用于任意数量的集合以进行差异,并且不会修改输入:
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);评估示例:
以
为例,假设第一个集合包含{2,4,6,8,9},第二个集合包含{2,8,9},第三个集合包含{2,4,8,9}。在所有这些集合中,元素6只出现一次。
once包含{ 2,4,6, 8,9},并且twice为空。添加第二个集合的once >d19twice >,4被添加到< twice >d20,8,9被重新添加到twice.once现在是{2,4,6,8,9} (所有集合的并集),twice现在是{2,4,8,9} (至少出现来自once的twice).twice的元素。once现在是{6}。返回once.发布于 2012-12-08 22:36:31
您可以使用contains()方法来完成此操作。首先,从所有其他集合创建一个新的HashSet。然后遍历这个集合,并检查其他集合是否contains()指定的元素。如果有两个或更多的列表包含它,那么您就有了一个副本,并且可以continue。例如,如果只有一个集合包含元素,则可以将其存储在不同的结果集中。
我编写了一个实用方法来实现您所需的功能:
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;
}发布于 2012-12-09 00:28:11
使用中间Multiset的Guava版本
@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;
}
});
}https://stackoverflow.com/questions/13778320
复制相似问题