gpt4 book ai didi

java-8 - 是否有一些仅限流的方法来确定最大流元素的索引?

转载 作者:行者123 更新时间:2023-12-01 09:13:57 26 4
gpt4 key购买 nike

我有一个 Stream<Set<Integer>> intSetStream

我可以在上面做这个......

Set<Integer> theSetWithTheMax = intSetStream.max( (x,y)->{ return Integer.compare( x.size(), y.size() ); } ).get( );

...我得到了其中包含最多 Set<Integer> 个元素的 Integer

太好了。但我真正需要知道的是,最大的是 Set 中的第一个 Stream 吗?或者它是 Set 中的第 10 个 Stream ?还是第 iSet?其中哪一个元素最多?

所以我的问题是:有没有什么方法——使用 Stream API——我可以确定“返回最大值的是 iSet 中的第 StreamSet其中,对于 Set.size( ) 调用"?

我能想到的最佳解决方案是迭代 Stream<Set<Integer>>(使用 intSetStream.iterator())并进行手动 max( ) 计算。但我希望学习更多 Stream -y 方法来解决它;如果有这样的事情。

最佳答案

您可以使用自定义收集器执行此操作:

int posOfMax = stream.mapToInt(Set::size)
.collect(() -> new int[] { 0, -1, -1 },
(a,i) -> { int pos = a[0]++; if(i>a[2]) { a[1] = pos; a[2] = i; } },
(a1,a2) -> {
if(a2[2] > a1[2]) { a1[1] = a1[0]+a2[1]; a1[2] = a2[2]; }
a1[0] += a2[0];
})[1];

这是最轻量级的解决方案。当我们使用专用类而不是数组时,它的逻辑变得更加清晰:

int posOfMax = stream.mapToInt(Set::size)
.collect(() -> new Object() { int size = 0, pos = -1, max = -1; },
(o,i) -> { int pos = o.size++; if(i>o.max) { o.pos = pos; o.max = i; } },
(a,b) -> {
if(b.max > a.max) { a.pos = a.size+b.pos; a.max = b.max; }
a.size += b.size;
}).pos;

状态对象保存大小,它只是到目前为止遇到的元素的数量,最后遇到的最大值及其位置,如果当前元素大于最大值,我们将其更新为大小的前一个值。这就是 accumulator 函数(collect 的第二个参数)所做的。

为了支持任意评估顺序,即并行流,我们必须提供一个combiner 函数(collect 的最后一个参数)。它将两个部分评估的状态合并到第一个状态。如果第二个状态的最大值更大,我们更新第一个状态的最大值和位置,而我们必须将第一个状态的大小添加到第二个状态的位置以反射(reflect)两者都是部分结果的事实。此外,我们必须将大小更新为两个大小的总和。

关于java-8 - 是否有一些仅限流的方法来确定最大流元素的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49782716/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com