使用Java Streams对整数幂集

时间:2018-03-24 19:05:27

标签: java parallel-processing set java-stream powerset

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

即。 {1,2,3} - &gt; {{},{1},{2},{3},{1,2},{2,3},{1,3},{1,2,3}}

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

我想使用java流来并行化此操作并返回也是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));

或与比较器有关的事情(我不确定我是否正确行事)。

请指教,谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

这是根据您的条件进行过滤,然后根据比较设置大小的比较器拉出最大值。

答案 1 :(得分:0)

您的主要问题是使用错误的比较器语法。相反,你想要的东西是:

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

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

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

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