首页 > 解决方案 > 使用 Java Stream API 按降序对数组进行部分排序

问题描述

我需要知道如何使用 Stream API 按降序对原始唯一整数数组进行部分排序。例如,如果有一个类似 的数组{1,2,3,4,5},我想先获取{5,4,3, 1,2}- 3 个最大的元素,然后是其余的。甚至可以使用流吗?我检查了文档 - 有两种方法skiplimit但它们会更改流内容并从数组的开头开始工作。

我可以像这样对整个数组进行排序

Arrays.stream(arr)
.boxed()
.sorted(Collections.reverseOrder())
.mapToInt(Integer::intValue)
.toArray();

但是如何使这种排序局部化?我说 Stream API 是因为我希望它写得很好。

我也直觉地觉得concat可能在这里。我可以考虑的另一种方法是使用自定义比较器来限制排序元素的数量。你怎么看?

PS我不是Java专家。

标签: javaarrayssortingjava-stream

解决方案


尽管代码比公认的答案长,但它的排序要少得多:对于大数组,这很重要:

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;
}

推荐阅读