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

如何在java中删除哈希集中的重复项并存储在第三个哈希集中,java,Java,我想从哈希集中完全删除重复项 例如: 哈希集names1包含a、b、c、d 哈希集names2包含x,y,z,a 我希望hashsetnames3应该有b、c、d、x、y、z 删除两个哈希集之间的公共元素并将其存储在第三个哈希集中。如何执行此操作?您希望两个哈希集的并集减去交集。因此,基本上,这两组中的唯一项目: public void union(Set<E> s){ set.addAll(s); } public void intersection(Set<E

我想从哈希集中完全删除重复项

例如:

  • 哈希集
    names1
    包含
    a、b、c、d
  • 哈希集
    names2
    包含
    x,y,z,a
我希望hashset
names3
应该有
b、c、d、x、y、z


删除两个哈希集之间的公共元素并将其存储在第三个哈希集中。如何执行此操作?

您希望两个哈希集的并集减去交集。因此,基本上,这两组中的唯一项目:

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) );
}
公共无效联合(集合s){
set.addAll(s);
}
公共无效交叉点(集合s){
集。保留;
}
公共无效唯一(集合s){
集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合;
}

您可以找到2个列表和从联合列表中删除的交集:

找到所有交叉点

Set<String> uniques = new HashSet<String>(names1);
uniqueNums.retainAll(names2);
Set uniques=新哈希集(名称1);
唯一保留名称(名称2);

要找到唯一的元素,需要找到两个集合的并集,减去它们的交集

您可以使用
Set
addAll
retainal
removeAll
方法来实现这一点:

Set union = new HashSet(setA);
union.addAll(setB);

Set intersection = new HashSet(setA);
intersection.retainAll(setB);

Set unique = new HashSet(union);
unique.removeAll(intersection);

正如其他人所说,这是并集减去交集。要轻松实现这一点,可以使用或库。下面是使用Commons Collections
CollectionUtils
类的代码:

Collection result = CollectionUtils.union(set1, set2);
result.removeAll(CollectionUtils.intersection(set1, set2));
HashSet result = new HashSet(Sets.union(set1, set2));
result.removeAll(Sets.intersection(set1, set2));
result
将是一个集合,可以使用
newhashset(result)


下面是使用Google的Guava library
Sets
class的实现:

Collection result = CollectionUtils.union(set1, set2);
result.removeAll(CollectionUtils.intersection(set1, set2));
HashSet result = new HashSet(Sets.union(set1, set2));
result.removeAll(Sets.intersection(set1, set2));

如果不想修改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;
    }
1.找到最大的集合并添加到新集合。
2.迭代小集合,如果它已经存在,则删除,否则添加它。
公共静态集合getIntersection(集合集合1、集合集合集合2){
布尔值set1IsLarger=set1.size()>set2.size();
Set smallerSet=set1IsLarger?set2:set1;
Set largerSet=set1IsLarger?set1:set2;
Set intersection=newhashset(set1.size()+set2.size());
交叉点。添加所有(大集合);
对于(E值:smallerSet){
如果(!largerSet.contains(value)){
增加(价值);
}否则{
删除(值);
}
}
折返交叉口;
}

两个集合中都没有共同的元素,因此很难理解您想要什么。编辑您的问题…您自己尝试过什么吗?给我们看一些代码。那么,您想要集合并集减去交集吗?@tobias_k,我也是这样理解的。@fge
a
对这两个集合都是共同的。这个想法很好,但实现似乎很简单非常奇怪。首先,所有这些操作都会修改
set
,因此我猜会有各种不必要的行为。而且,
联合
交集
不会返回任何内容,因此这甚至不会编译。如果这是伪代码,请将其标记为伪代码。我很想提供工作代码,但我们需要查看@us的代码er3569467.如果这是某人的家庭作业,那么我很乐意提供建议,但不是为他们这样做。这是正确的(有效的)解决方案。这是给你的建议,OP。