使用 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
。后者是原始类型,除非别无选择,否则应避免使用它们。
最后但同样重要的是,如果您还没有这样做,那么我建议您先尝试按顺序执行代码,如果您认为可以从并行流中受益,那么您可以继续使用当前的方法。
我正在从原始集 (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
。后者是原始类型,除非别无选择,否则应避免使用它们。
最后但同样重要的是,如果您还没有这样做,那么我建议您先尝试按顺序执行代码,如果您认为可以从并行流中受益,那么您可以继续使用当前的方法。