4

是否有任何最佳方法来获得所有集合并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);
    }
}

所有集合组合的n交集

4

2 回答 2

4

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

  1. 如果您有一个sets列表,您可以将其元素(即sets )展平为一唯一值:

    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]
    
  2. 如果您有更深层次的嵌套,那么您必须执行更深层次的展平

    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]
    
  3. 如果您有多个嵌套级别未知的集合,则可以创建通用递归展平方法:

    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);
            }
        });
    }
    

另请参阅:
并行矩阵乘法
所有集合组合的n交集

于 2021-02-05T00:27:18.380 回答
0
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());

或者

s1.addAll(s2;

使用上面内置的 java lib

于 2021-05-12T17:51:19.130 回答