我想完全从hashsets中删除重复项。
例如:
names1
包含a, b, c, d
names2
包含x, y, z, a
我希望哈希集names3
应该有b, c, d, x, y, z
删除2个哈希集之间的公共元素并将其存储在第三个hashset.how中来执行此操作?
答案 0 :(得分:1)
你想要两个HashSets的联盟,减去交集。所以,基本上,两组中的独特项目:
public void union(Set<E> s){
set.addAll(s);
}
public void intersection(Set<E> s){
set.retainAll(s);
}
public void unique(Set<E> s){
set.addAll( set.union(s).removeAll( set.intersection(s) );
}
答案 1 :(得分:1)
要查找唯一元素,您需要找到两个集合的 union ,减去它们的交集。
您可以使用addAll
的{{1}},retainAll
和removeAll
方法实现此目的:
Set
答案 2 :(得分:0)
你可以找到2列表之间的交集,而不是从联合列表中删除:
找到所有交叉点Set<String> uniques = new HashSet<String>(names1);
uniqueNums.retainAll(names2);
答案 3 :(得分:0)
正如其他人所说,这是工会减去交叉点。要轻松实现这一点,您可以使用Apache Commons Collections或Google Guava库。这是使用Commons Collections CollectionUtils
类的代码:
Collection result = CollectionUtils.union(set1, set2);
result.removeAll(CollectionUtils.intersection(set1, set2));
result
将是一个集合,可以使用new HashSet(result)
以下是使用Google的Guava库Sets
类:
HashSet result = new HashSet(Sets.union(set1, set2));
result.removeAll(Sets.intersection(set1, set2));
答案 4 :(得分:0)
如果您不想修改Set1和Set2。
1. Find Largest Set and add to new one.
2. Iterate Small Set and if it already exists remove , else add it.
public static <E> Set<E> getIntersection(Set<E> set1, Set<E> set2) {
boolean set1IsLarger = set1.size() > set2.size();
Set<E> smallerSet = set1IsLarger ? set2 : set1;
Set<E> largerSet = set1IsLarger ? set1 : set2;
Set<E> intersection = new HashSet<E>(set1.size()+set2.size());
intersection.addAll(largerSet);
for (E value : smallerSet) {
if (!largerSet.contains(value)){
intersection.add(value);
}else{
intersection.remove(value);
}
}
return intersection;
}