如何在java中获得DoubleStream的第k个最大元素

如何在java中获得DoubleStream的第k个最大元素,java,java-8,java-stream,Java,Java 8,Java Stream,在java中,获得DoubleStream中第k个最大元素的最佳方法是什么 我知道我们可以使用.max().getDouble()来获取最大的元素。对流进行排序,将其转换为数组,并获取array.length-k处的项 例如: private static double getKth(DoubleStream ds, int k) { double[] array = ds .sorted() .toArray(); return array[ar

在java中,获得DoubleStream中第k个最大元素的最佳方法是什么


我知道我们可以使用.max().getDouble()来获取最大的元素。

对流进行排序,将其转换为数组,并获取array.length-k处的项

例如:

private static double getKth(DoubleStream ds, int k) {
    double[] array = ds
        .sorted()
        .toArray();
    return array[array.length-k];
}

您应该添加验证,以确保
k
具有合法值

对流进行排序,将其转换为数组,并在array.length-k处获取项

例如:

private static double getKth(DoubleStream ds, int k) {
    double[] array = ds
        .sorted()
        .toArray();
    return array[array.length-k];
}

您应该添加验证,以确保
k
具有合法值

一旦有了
DoubleStream
,则将其按相反顺序排序(DESC)。然后
限制(k)
并对ASC进行排序,首先取

.boxed()
.distinct() //in case you want to ignore repeating values
.sorted(Comparator.reverseOrder())
.limit(k)
.sorted()
.findFirst());

一旦有了
DoubleStream
,将其按相反顺序排序(DESC)。然后
限制(k)
并对ASC进行排序,首先取

.boxed()
.distinct() //in case you want to ignore repeating values
.sorted(Comparator.reverseOrder())
.limit(k)
.sorted()
.findFirst());
将为您提供第k个最大元素,如果流中的元素少于k,则为
null



将为您提供第k个最大元素,如果流中的元素少于k个,则为
null

是否尝试搜索它?在各种数据结构中寻找第k大元素有很多问题。还有,请看。这可能是重复的,怎么可能太宽了?你试着搜索了吗?在各种数据结构中寻找第k大元素有很多问题。还有,请参阅。这可能是重复的,怎么可能太宽?或者使用skip and limit代替
.toArray()
@c0der介意展示一些代码吗?我会尝试一下(我不是落选者)我确实发布了一些代码,但是@Holger的评论不太好,所以我删除了它。不管怎么说,我看到其他人使用skip和Limithmm两次没有评论的否决票。非常有用。。。我在我的机器上用几个不同的箱子测试了它,它似乎工作得很好!或者使用skip和limit代替
.toArray()
@c0der介意展示一些代码吗?我会尝试一下(我不是落选者)我确实发布了一些代码,但是@Holger的评论不太好,所以我删除了它。不管怎么说,我看到其他人使用skip和Limithmm两次没有评论的否决票。非常有用。。。我在我的机器上用几个不同的箱子测试了它,它似乎工作得很好!它将返回第k个最小的元素,而不是最大的元素。如果列表在第n个数字之前有重复项,那么假设我们要找到第二个最大的元素,数组是2,1,6,6,通过排序,它将给出6,6,2,1,第二个元素将给出6,但这不是true@xenteros你限制了
k
最小的元素你试过你的代码了吗?我只是出于怀疑而这样做,它返回第k个最小的元素。
.boxed()[.distinct()].sorted(Comparator.reverseOrder()).skip(k).findFirst()
仅此而已。它将返回第k个最小的元素,而不是最大的元素。如果列表在第n个数字之前有重复项,那么假设我们要找到第二个最大的元素,数组是2,1,6,6,通过排序,它将给出6,6,2,1,第二个元素将给出6,但这不是true@xenteros你限制了
k
最小的元素你试过了吗密码?我只是出于怀疑而这样做,它返回第k个最小的元素。
.boxed()[.distinct()].sorted(Comparator.reverseOrder()).skip(k).findFirst()
仅此而已。@Holger流可能包含少于
k
elements@Holger此解决方案是否比使用盒装流进行排序降序(可能更容易阅读)更快/更高效?这取决于流的大小和实现。好吧,在当前实现中使用
distinct()
时,您仍然会有装箱开销。但是如果你真的需要这个操作来提高效率,你应该两个都不使用,而是做一些事情;对于k个最小或最大的元素也是如此。调用
distinct()
,可以满足什么要求?@shmosel一些评论者问应该如何处理重复条目:[1,2,3,3]的第二大元素是3还是2?由于NeedleBallista没有及时应答,因此添加了distinct调用作为忽略重复项的选项。@Holger流可能包含少于
k
elements@Holger此解决方案是否比使用盒装流进行排序降序(可能更易于阅读)更快/更高效?@Malte Hartwig:这取决于流的大小和实现。好吧,在当前实现中使用
distinct()
时,您仍然会有装箱开销。但是如果你真的需要这个操作来提高效率,你应该两个都不使用,而是做一些事情;对于k个最小或最大的元素也是如此。调用
distinct()
,可以满足什么要求?@shmosel一些评论者问应该如何处理重复条目:[1,2,3,3]的第二大元素是3还是2?由于NeedleBallista没有及时响应,因此添加了独特的呼叫作为忽略重复呼叫的选项。