如果我明白你的問題科爾實際上,您需要一種方法來接收一組集合並添加任何集合,這些集合是一個或多個成員的聯合或一個或多個成員的交集。
如果這是正確的,那麼它肯定可以用標準Java完成 - 不需要Guava或其他庫。
寫作方法來尋找並集或交集是相當簡單:
Set<T> union(Set<Set<T>> sets) {
return sets.stream().reduce(new HashSet<>(),
(s1, s2) -> {
s1.addAll(s2);
return s1;
});
}
交集是稍硬:你需要複製集,以避免改變他們:
Set<T> intersection(Set<Set<T>> sets) {
return sets.stream().map(HashSet::new).reduce(
(s1, s2) -> {
s1.retainAll(s2);
return s1;
});
}
而且更復雜位:對所有成員組合執行這些操作。
void topology(Set<Set<T>> sets) {
process(new HashSet<>(sets), sets);
}
private void process(Set<Set<T>> input, Set<Set<T>> output) {
if (!input.isEmpty()) {
output.add(union(input));
output.add(intersection(input));
input.stream().forEach(el1 ->
process(input.stream().filter(el2 -> !el1.equals(el2))
.collect(toSet()), output));
}
}
如果您需要進一步解釋這些方法,請在評論中告訴我。
我試圖與集合{{1,3,5},{2,3,7},{4,7,9}}和接收的結果:
[[], [1, 2, 3, 5, 7], [3], [4, 7, 9], [7], [1, 3, 5], [2, 3, 4, 7, 9], [2, 3, 7], [1, 3, 4, 5, 7, 9], [1, 2, 3, 4, 5, 7, 9]]
我通過假定由於原始集的第一個元素和最後一個元素不重疊,因此您需要在結果中設置空集的問題的定義。