30

Set在 Java中创建联合或交集的最简单方法是什么?对于这个简单的问题,我已经看到了一些奇怪的解决方案(例如,手动迭代这两个集合)。

Java 集的并集/交集

4

3 回答 3

54

最简单的单行解决方案是这样的:

set1.addAll(set2); // Union
set1.retainAll(set2); // Intersection

上述解决方案是破坏性的,这意味着我改变了原始set1的内容。
如果您不想接触现有的集合,请创建一个新集合:

var result = new HashSet<>(set1);          // In Java 10 and above
Set<Integer> result = new HashSet<>(set1); // In Java < 10
result.addAll(set2); // Union
result.retainAll(set2); // Intersection
于 2018-06-30T08:23:18.187 回答
22

虽然番石榴肯定更整洁且非常标准,但这是一种仅使用标准 Java进行联合相交的非破坏性方法

Set s1 = Set.of(1,2,3);
Set s2 = Set.of(3,4,5);     

Set union = Stream.concat(s1.stream(),s2.stream()).collect(Collectors.toSet()); 
Set intersect = s1.stream().filter(s2::contains).collect(Collectors.toSet());
于 2018-12-06T22:47:24.583 回答
8

您可以使用Google's Guava library. 下面借助示例给出以下解释:

    // Set a
    Set<String> a = new HashSet<String>();
    a.add("x");
    a.add("y");
    a.add("z");

    // Set b
    Set<String> b = new HashSet<String>();
    b.add("x");
    b.add("p");
    b.add("q");

现在,在 Java 中计算两个集合的交集:

Set<String> intersection = Sets.intersection(a, b);
System.out.printf("Intersection of two Set %s and %s in Java is %s %n",
                a.toString(), b.toString(), intersection.toString());

输出: Intersection of two Set [z, y, x] and [q, p, x] in Java is [x]

同样,在 Java 中计算两个 Set 的并集:

Set<String> union = Sets.union(a, b);
System.out.printf("Union of two Set %s and %s in Java is %s %n",
                a.toString(), b.toString(), union.toString());

输出: Union of two Set [z, y, x] and [q, p, x] in Java is [q, p, x, z, y]

您可以在https://google.github.io/guava/releases/18.0/api/docs/阅读有关番石榴库的更多信息

为了将番石榴库添加到您的项目中,您可以查看https://stackoverflow.com/a/4648947/8258942

于 2018-06-30T08:34:40.320 回答