【发布时间】:2015-01-31 12:53:08
【问题描述】:
我有多个Set<String>,需要合并为一个Set<String>。我如何在 Java 中执行此操作?请注意,我正在尽我所能使用guava API 来提供帮助。比如我有3个类如下。
public class One {
public static Set<String> SET = Sets.newHashSet("a","b","c");
}
public class Two {
public static Set<String> SET = Sets.newHashSet("a","d","e","f");
}
public class Three {
public static Set<String> SET = Sets.newHashSet("w","x","y","f");
}
现在,我需要将这些集合的任意组合合并为一个。比如我可能需要合并
-
One.SET+Two.SET+Three.SET合二为一产生 { "a","b","c","d","e","f","w","x","y " }, -
One.SET+Three.SET合二为一产生 { "a","b","c","w","x","y","f" }, -
Two.SET+Three.SET合二为一产生 { "a","d","e","f","w","x","y" }, - 等等
我创建了一个方法来合并一组集合 Set<String>[],但这不起作用(在此 SO 帖子 Creating an array of Sets in Java 对此进行了解释)。这是要合并的代码。它可以工作(编译)。
public static Set<String> immutableSetOf(Set<String>[] sets) {
Set<String> set = new HashSet<String>();
for(Set<String> s : sets) {
set.addAll(s);
}
return ImmutableSet.copyOf(set);
}
这是调用代码;它不起作用(无法编译)。
Set<String> set = Utils.immutableSetOf(new Set<String>[] { One.SET, Two.SET });
所以,我修改了我的合并方法以在 List<Set<String>> 而不是 Set<String>[] 上进行操作。只有参数类型发生了变化,但为了完整起见,我把它放在这里。
public static Set<String> immutableSetOf(List<Set<String>> sets) {
Set<String> set = new HashSet<String>();
for(Set<String> s : sets) {
set.addAll(s);
}
return ImmutableSet.copyOf(set);
}
所以,现在我的调用代码如下所示。
Set<String> set = Utils.immutableSetOf(
Lists.newArrayList(
One.SET, Two.SET));
此代码无法编译,因为 Lists.newArrayList(...) 返回的是 Set<String> 而不是 List<Set<String>>。方法Lists.newArrayList(...)被重载了,我传入set时使用的方法的签名是List.newArrayList(Iterable<? extends E> elements)。
那么,问题是,在考虑调用代码的同时,如何定义一个方法来合并任意数量的Set<String>?我注意到编译问题出在调用代码上(不是合并方法),但也许解决方案也与合并代码有关?
更新:我也尝试了可变参数,但它会产生自己的警告 (Is it possible to solve the "A generic array of T is created for a varargs parameter" compiler warning?)。合并方法签名现在如下。
public static Set<String> immutableSetOf(Set<String>... sets)
现在调用代码如下,我得到“类型安全:为可变参数创建了一个 Set 的通用数组”。
Set<String> set = Utils.immutableSetOf(One.SET, Two.SET);
更新:对于接受的答案,我执行了以下操作。
@SuppressWarnings("unchecked")
Set<String> set = Utils.immutableSetOf(Set[] { One.SET, Two.SET });
【问题讨论】:
标签: java collections guava