我正在从原始集(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));
或与比较器有关的事情(我不确定我是否正确行事)。
请指教,谢谢。
答案 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
,就像在示例代码段中一样。后者是原始类型,除非别无选择,否则应避免使用它们。
最后,但并非最不重要的是,如果您还没有这样做,那么我建议您先尝试顺序执行代码,如果您认为可以从并行流中受益,那么您可以继续使用当前代码方法