【问题标题】:how to delete duplicates in hashsets in java and store in third hashset [duplicate]如何在java中删除hashset中的重复项并存储在第三个hashset中[重复]
【发布时间】:2014-04-24 15:21:08
【问题描述】:

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

例如:

  • 哈希集names1 包含a, b, c, d
  • 哈希集names2 包含x, y, z, a

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

删除2个hashset之间的共同元素,存入第三个hashset,怎么做?

【问题讨论】:

  • 在这两个集合中都没有共同的元素,所以很难理解你想要什么。编辑您的问题...
  • 您自己尝试过什么吗?给我们看一些代码
  • 那么,你想要集合并减去交集吗?
  • @tobias_k,我也是这么读的。
  • @fge a 对两者都是通用的。

标签: java


【解决方案1】:

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

您可以使用SetaddAllretainAllremoveAll 方法实现此目的:

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

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

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

【讨论】:

  • 这是正确(且有效)的解决方案。这是给你的ideone,OP。
【解决方案2】:

你想要两个 HashSet 的并集,减去交集。所以,基本上,这两组的独特物品:

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) );
}

【讨论】:

  • 这个想法是合理的,但实现似乎很奇怪。首先,所有这些操作都会修改set,所以我猜会有各种不想要的行为。此外,unionintersection 不返回任何内容,因此甚至无法编译。如果是伪代码,请标记为伪代码。
  • 我很想提供工作代码,但是我们需要查看@user3569467 的代码。如果这是某人的作业,那么我很乐意提供建议,但不会为他们做。
【解决方案3】:

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

找到所有的交点

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

【讨论】:

    【解决方案4】:

    正如其他人所说,这是并集减去交集。为了轻松实现,您可以使用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));
    

    【讨论】:

      【解决方案5】:

      如果您不想修改 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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多