【问题标题】:Adding elements from two Sets从两个集合中添加元素
【发布时间】:2011-11-07 03:58:10
【问题描述】:

如何从两个集合中添加元素?

If there's a set one (1, 3, 6, 8)
And a set two (2, 4, 6, 8)

我如何将这两者中的元素组合在一起?

Output should be (1, 2, 3, 4, 6, 8)

这是我尝试过的:

Set<Integer> one = new HashSet();
one.add(1);
one.add(3);
// and so on
Set<Integer> two = new HashSet();
two.add(2);
two.add(4);
// and so on
Set<Integer> newSet = new HashSet();
newSet.add(one);
newSet.add(two);

return newSet;

这不起作用,因为 add 方法仅适用于单个整数,而不适用于整数集合。有什么方法可以把两个集合加起来吗?

我还必须退回套装。我该怎么做?

【问题讨论】:

  • 尝试使用 addAll 而不是 add

标签: java int set


【解决方案1】:

使用Set.addAll()

Set<Integer> one = new HashSet<Integer>();
Set<Integer> two = new HashSet<Integer>();
Set<Integer> newSet = new HashSet<Integer>(one);
newSet.addAll(two);

此外,您应该键入您的构造函数(如上)。

要将它变成一个方法,试试这个:

public static Set<Integer> addTwoSets(Set<Integer> one, Set<Integer> two) {
    Set<Integer> newSet = new HashSet<Integer>(one);
    newSet.addAll(two);
    return newSet;
}

让我们发疯吧...这里有一个方法,它将获取扩展所需类型的任意类型的任意数量的集合,并将它们合并到一个集合中:

public static <T> Set<T> merge(Collection<? extends T>... collections) {
    Set<T> newSet = new HashSet<T>();
    for (Collection<? extends T> collection : collections)
        newSet.addAll(collection);
    return newSet;
}

或 Java 8+:

public static <T> Set<T> merge(Collection<? extends T>... collections) {
    return Arrays.stream(collections).flatMap(Collection::stream).collect(toSet());
}

【讨论】:

    【解决方案2】:

    你不想要一套。正如您所发现的,根据定义,它们没有重复的元素。您正在寻找一个 Multiset(实际上,从外观上看是一个 SortedMultiset),也称为 Bag。 Java 没有现成的,但有可用的开源实现,例如,Google's。

    编辑:另外,你想做setOne.addAll(setTwo),而不是一次一个元素,如上所述,但这是次要问题。

    【讨论】:

    • 好吧,实际上我想稍后删除重复项。
    • 嗯,这绝对不是您最初要求的,因为您的示例输出有重复。
    • bag和list有什么区别?
    • 一个 bag 没有 list 的隐式排序,并不是说一个元素小于另一个元素,而是感觉它在列表中的另一个之前。现在,有序包当然可以实现为有序列表,但使用树可能更有效。
    • 有人在 3.5 年后投了反对票而没有评论?好的……
    【解决方案3】:

    作为波西米亚人mentioned,最好的答案是使用 Set.addAll()。请记住,如果您不介意覆盖其中一个集合,那么将一个集合直接添加到另一个集合会更有效(至少从开发人员时间的角度来看:P):

    one.addAll(two);
    

    【讨论】:

      【解决方案4】:

      或者交替使用排序的 ArrayList:

      ArrayList<Integer> list = new ArrayList<Integer>(one);
      list.addAll(two);
      Collections.sort(list);
      

      【讨论】:

      • 这不会消除重复。
      猜你喜欢
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2015-03-26
      • 2013-02-09
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多