如何在java中删除hashset中的重复项并存储在第三个hashset中

时间:2014-04-24 15:21:08

标签: java

我想完全从hashsets中删除重复项。

例如:

  • hashset names1包含a, b, c, d
  • hashset names2包含x, y, z, a

我希望哈希集names3应该有b, c, d, x, y, z

删除2个哈希集之间的公共元素并将其存储在第三个hashset.how中来执行此操作?

5 个答案:

答案 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}},retainAllremoveAll方法实现此目的:

Set

答案 2 :(得分:0)

你可以找到2列表之间的交集,而不是从联合列表中删除:

找到所有交叉点

Set<String> uniques = new HashSet<String>(names1);
uniqueNums.retainAll(names2);

答案 3 :(得分:0)

正如其他人所说,这是工会减去交叉点。要轻松实现这一点,您可以使用Apache Commons CollectionsGoogle 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;
    }