【问题标题】:Using Java Streams to operate on an integer power set使用 Java Streams 对整数幂集进行运算
【发布时间】:2018-03-24 19:05:26
【问题描述】:

我正在从原始集 (Set<Integer>) 生成一个功率集 (Set<Set<Integer>>)。

即{1, 2, 3} -> { {}, {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));

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

请指教,谢谢。

【问题讨论】:

  • Comparator Set&lt;Integer&gt; comparator - 这似乎不是有效的 Java 代码。
  • 这可能是一个很好的问题,但我们需要更多关于您想要实现的目标的详细信息,并为每个不同的错误消息显示产生它的代码。就目前而言,这还不清楚,因此离题了。
  • 转换使用的类型错误。

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


【解决方案1】:

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

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

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

【讨论】:

  • 您可以将(set1, set2) -&gt; Integer.compare(set1.size(), set2.size()) 简化为Comparator.comparing(Set::size) 或更好的Comparator.comparingInt(Set::size)
  • @Aominè 太酷了……没想到。感谢您的提示!
  • 谢谢!这就像一个魅力!还要感谢@Aominè,巧妙的把戏!
【解决方案2】:

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

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

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

另外,请注意使用Optional&lt;Set&lt;Integer&gt;&gt; 作为接收器类型,而不是Optional,如示例代码sn-p 中所示。后者是原始类型,除非别无选择,否则应避免使用它们。

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

【讨论】:

    猜你喜欢
    • 2018-11-07
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2012-06-27
    • 2011-06-30
    • 2011-10-29
    相关资源
    最近更新 更多