gpt4 book ai didi

java - 我如何取集合的并集?

转载 作者:行者123 更新时间:2023-12-03 23:00:44 24 4
gpt4 key购买 nike

是否有任何最佳方法可以获得 n 的所有联合?套?
这是我做的,但是对于大量的集合来说很慢:

public static void main(String[] args) {
List<List<Set<Integer>>> unionSet = new ArrayList<>();
List<List<Integer>> sets = ...
double avail = 0;
for (int i = 1; i <= sets.size(); i++) {
List<Set<Integer>> us = new ArrayList<>();
union(sets, us, new HashSet<>(), i, 0);
unionSet.add(us);
}
}
public static void union(
List<List<Integer>> sets, List<Set<Integer>> unionSet,
Set<Integer> set, int size, int index) {
for (int i = index; i < sets.size(); i++) {
Set temp = new HashSet(set);
temp.addAll(sets.get(i));

if (size != 1)
union(sets, unionSet, temp, size - 1, i + 1);
else
unionSet.add(temp);
}
}
The intersection of all combinations of n sets

最佳答案

您可以使用 Stream#flatMap 方法如下:

  • 如果您有一组集合,则可以将其元素(即集合)展平为一组唯一值:
    List<Set<Integer>> setList =
    List.of(Set.of(1, 2, 3), Set.of(2, 3, 7));

    Set<Integer> set = setList.stream()
    .flatMap(Set::stream)
    .collect(Collectors.toSet());

    System.out.println(set); // [1, 2, 3, 7]
  • 如果您有更深层次的嵌套,那么您必须执行更深层次的扁平化:
    List<List<Set<Integer>>> lists = List.of(
    List.of(Set.of(1, 2, 3), Set.of(2, 3, 4)),
    List.of(Set.of(3, 4, 5), Set.of(5, 1, 2)));

    Set<Integer> set = lists
    // Stream<List<Set<Integer>>>
    .stream()
    // Stream<Set<Integer>>
    .flatMap(List::stream)
    // Stream<Integer>
    .flatMap(Set::stream)
    .collect(Collectors.toSet());

    System.out.println(set); // [1, 2, 3, 4, 5]
  • 如果您有多个嵌套级别未知的集合,您可以创建一个通用的递归展平方法:
    public static void main(String[] args) {
    List<Set<Integer>> setList =
    List.of(Set.of(1, 2, 3), Set.of(2, 3, 7));

    List<List<Set<Integer>>> lists = List.of(
    List.of(Set.of(1, 2, 3), Set.of(2, 3, 4)),
    List.of(Set.of(3, 4, 5), Set.of(5, 1, 2)));

    Set<Integer> set = (Set<Integer>) toSet(setList, lists);
    System.out.println(set); // [1, 2, 3, 4, 5, 7]
    }
    public static Set<?> toSet(Collection<?>... collections) {
    return Arrays.stream(collections)
    .flatMap(col -> flattenStream(col.stream()))
    .collect(Collectors.toSet());
    }
    public static Stream<?> flattenStream(Stream<?> stream) {
    return stream.flatMap(e -> {
    if (e instanceof Collection) {
    return flattenStream(((Collection<?>) e).stream());
    } else {
    return Stream.of(e);
    }
    });
    }

  • 也可以看看:
    Parallelized Matrix Multiplication
    The intersection of all combinations of n sets

    关于java - 我如何取集合的并集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65922558/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com