使用 Java 流对整数幂集进行运算

Using Java Streams to operate on an integer power set

我正在从原始集 (Set<Integer>) 生成幂集 (Set<Set<Integer>>)。

即{1, 2, 3} -> { {}, {1}, {2}, {3}, {1,2}, {2,3}, {1,3}, {1,2,3} }

然后我使用 isClique(Set<Integer>) 方法,如果给定集是我正在使用的邻接矩阵中的 clique,则 return 是一个布尔值。

我想使用 java 流来并行化此操作,return 最大的子集也是一个 clique。

我在想这样的事情,但我想出的每一个变体都会导致各种编译错误。

Optional result = powerSet.stream().parallel().
    filter(e ->{return(isClique(e));}).
    collect(Collectors.maxBy(Comparator Set<Integer> comparator));

我要么得到:

MaxClique.java:86: error: incompatible types: Stream<Set<Integer>> cannot be converted to Set<Integer>
    currentMax = powerSet.stream().parallel().filter(e -> { return (isClique(e));});//.collect(Collectors.maxBy(Comparator <Set<Integer>> comparator));

或与比较器相关的东西(我不确定我做的是否正确)。

请指教,谢谢。

您有一些语法问题。但除此之外,您可以使用以下方法计算相同的可选值:

Optional<Set<Integer>> result = powerSet.stream().parallel()
    .filter(e -> isClique(e))
    .collect(
       Collectors.maxBy(
           (set1, set2) -> Integer.compare(set1.size(), set2.size())
       )
    );

这是根据您的条件进行过滤,然后根据比较集合大小的比较器提取最大值。

您的主要问题是对比较器使用了错误的语法。相反,您需要类似以下内容的内容:

Optional<Set<Integer>> resultSet = 
                    powerSet.stream()
                            .parallel()
                            .filter(e -> isClique(e))
                            .max(Comparator.comparingInt(Set::size));

请注意使用 max 方法而不是 maxBy,这是因为 maxBy 通常用作下游收集器。事实上,它存在的真正动机是用作下游收集器。

另外,请注意使用 Optional<Set<Integer>> 作为接收器类型,而不是示例代码片段中的 Optional。后者是原始类型,除非别无选择,否则应避免使用它们。

最后但同样重要的是,如果您还没有这样做,那么我建议您先尝试按顺序执行代码,如果您认为可以从并行流中受益,那么您可以继续使用当前的方法。