java - 使用 Java Stream API 按降序对数组进行部分排序
问题描述
我需要知道如何使用 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
可能在这里。我可以考虑的另一种方法是使用自定义比较器来限制排序元素的数量。你怎么看?
PS我不是Java专家。
解决方案
尽管代码比公认的答案长,但它的排序要少得多:对于大数组,这很重要:
private static int[] partiallySorted(int[] input, int bound) {
int[] result = new int[input.length];
int i = -1;
PriorityQueue<Integer> pq = new PriorityQueue<>(bound, Comparator.naturalOrder());
for (int x : input) {
pq.add(x);
if (pq.size() > bound) {
int el = pq.poll();
result[bound + ++i] = el;
}
}
while (!pq.isEmpty()) {
result[--bound] = pq.poll();
}
return result;
}
推荐阅读
- python - 如何在 Tkinter 中捕获按键事件?
- google-sheets - (谷歌表格/谷歌表格)我希望能够从不同的列中收集实时数据并让它们填充一列
- python - 运行 Python 后端 Firebase
- ios - 由于 SKOverlay.AppConfiguration,Apple 硅 Mac 支持问题
- go - 如何生成字母切片
- mysql - MariaDB 使用 REGEXP 进行搜索
- php - 无法在视图中传递多表
- mongodb - MongoDb Where 子句中的嵌套查询
- javascript - 将一个数组的元素过滤到js中的另一个数组
- node.js - MongoDB Atlas 是否提供离线支持?