我正在尝试测试一个可能的拓扑,它是一组开集。为此,我需要找到集合的并集和交集。这样做我可以创建一个 Generated Topology 。我认为我能找到的最好的方法,至少不需要使用外部库 - 似乎 Google 有一个具有 Multiset 功能的 Guava 库,就是执行诸如 following 之类的操作。 (最后一个答案):
Set<Set<String>> myCollection = new HashSet<>();
当我可以以某种方式循环并将集合添加到“myCollection”时,我不知道是否值得尝试学习 Multiset 的各种方法。关于使用 Multiset 或 Bag 等东西的真正好处有什么建议吗?
更具体地说,我会有一组子集(超集),例如 {{A,B,D}, {B,C}}
,我们可以看到 {A ,B,D} U {B,C} = {A,B,C,D}
和 ${A,B,D} ∩ {B,C} = {B}$
code> 因此是 {{A,B,D}, {B,C}, {B}, {A,B,C,D}} 的新超集。
超集不会变得非常大,最多可能有几十个元素。
最佳答案
当您需要一个可以包含多个相同元素的Set
时,Multiset
非常有用(因为一个Set
只能容纳一个每个元素)。
如果您正在寻找多个 Set
的并集或交集,那么我确实建议使用 Google 的 Guava 库,因为它具有以下方法在 Sets.java
中对您有用:
static <E> Sets.SetView<E> union(Set<? extends E> set1, Set<? extends E> set2)
static <E> Sets.SetView<E> intersection(Set<E> set1, Set<?> set2)
如果您不想使用 Guava,那么有一些方法可以在 Java 中找到两个集合的并集和交集:
Set<Integer> first = new HashSet<>(Arrays.asList(1, 3, 5, 7));
Set<Integer> second = new HashSet<>(Arrays.asList(2, 4, 6, 8));
// Creates a new Set as a copy of 'first' and then adds every element from 'second' into the new Set, creating a union.
Set<Integer> union = new HashSet<>(first);
union.addAll(second);
System.out.println(union);
>> {1, 2, 3, 4, 5, 6, 7, 8}
// Creates a new Set as a copy of 'first' and then removes every element from the new Set that is not contained within 'second', creating an intersection.
Set<Integer> intersection = new HashSet<>(first);
intersection.retainAll(second);
System.out.println(intersection);
>> {}
关于java - Java 中集合的并集和交集(生成拓扑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43646394/