HashSet
在多个Integers
我想获得所有这些元素,它们没有重复。即在所有的联合中只出现过一次HashSet
。我无法以编程方式对其进行概念化。
例如,假设第一个集合包含 {2,4,6,8,9},第二个集合包含 {2,8,9},第三个集合包含 {2,4,8,9}。在所有这些集合中,元素 6 仅出现一次。
如何在Java的多个整数HashSet中找到所有不重复的元素?
问问题
1296 次
7 回答
4
您可以保存至少出现一次和至少两次的元素集。这有点手动循环,但它是可能的。这将适用于任意数量的差异集,并且不会修改输入:
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
为空。 - 添加第二个集合: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
_ 现在是 {6}。返回。once
once
once
于 2012-12-08T14:33:14.137 回答
1
您可以使用该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-08T14:36:30.740 回答
1
@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;
}
});
}
于 2012-12-08T16:28:11.240 回答
0
创建一个多重集并遍历它,取出计数为 1 的所有元素 O(n)
。
于 2012-12-08T14:33:54.767 回答
0
public static void main(String[] args) {
HashSet<Integer> set1 = new HashSet<Integer>();
set1.add(2);
set1.add(4);
set1.add(6);
set1.add(8);
set1.add(9);
HashSet<Integer> set2 = new HashSet<Integer>();
set2.add(2);
set2.add(8);
set2.add(9);
HashSet<Integer> set3 = new HashSet<Integer>();
set3.add(2);
set3.add(4);
set3.add(8);
set3.add(9);
set1.removeAll(set2);
set1.removeAll(set3);
System.out.println(set1);
}
于 2012-12-08T14:34:01.127 回答
0
如何创建 2 个新的 Hashset。称为 seenOnce 和 seenMoreThenOnce。
然后迭代不同哈希图中的所有整数。
For each integer:
If it is in seenMoreThenOnce do nothing.
else If it is in seenOnce, remove it from seenOnce and add it to seenMoreThenOnce
Else add it to seenOnce.
当您完成对所有哈希图的迭代时,seenOnce 将包含只看到一次的整数。
于 2012-12-08T14:35:23.460 回答
-1
public class test {
public static void main(String[] args) throws Exception, IOException {
int count=0;
HashSet<Integer> set1 = new HashSet<Integer>();
HashMap<Integer, String> ee=new HashMap<Integer,String>();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("how many elements u want to store");
int n=Integer.parseInt(br.readLine());
System.out.println("enter te element u want insert");
for(int i=0;i<n;i++)
{
boolean x=set1.add(Integer.parseInt(br.readLine()));
if(x==false)
{
count++;
}
}
System.out.println("no of duplicate elements is "+count);
}
}
于 2013-09-15T16:21:00.577 回答