【发布时间】:2020-01-08 08:50:01
【问题描述】:
我需要知道如何使用 Stream API 按降序对原始唯一整数数组进行部分排序。例如,如果有一个像 {1,2,3,4,5} 这样的数组,我想得到 {5,4,3, 1,2} - 首先是 3 个最大的元素,然后是其余的。甚至可以使用流吗?我检查了文档 - 有两种方法 skip 和 limit 但它们会更改流内容并从数组的开头开始工作。
我可以像这样对整个数组进行排序
Arrays.stream(arr)
.boxed()
.sorted(Collections.reverseOrder())
.mapToInt(Integer::intValue)
.toArray();
但是如何使这种排序局部化?我说 Stream API 是因为我希望它写得很好。
我也直觉地觉得concat 可能会在这里一展身手。我可以考虑的另一种方法是使用自定义比较器来限制排序元素的数量。你怎么看?
附:我不是 Java 专家。
【问题讨论】:
-
你将如何用纯 Java 解决它?输入是数组还是集合?
-
您的示例输入是
{1,2,3,4,5}。输入是否保证按升序排序? -
@Andrew Tobilko 输入是一个数组
int[]。在纯 Java 中,我会使用任何众所周知的算法,如插入排序等,在需要的元素按 desc 顺序排序后停止。问题是我需要通过一个测试用例并使用这种天真的算法我得到超时。 -
“其他”元素是否有必要按其原始顺序排列?如果不是,那么普通排序不会基本上解决这个问题吗?编辑:我刚刚看到你关于超时的评论。
-
@curveball 我非常怀疑你会通过将它们重写为 Stream API 来加快速度......
标签: java arrays sorting java-stream