如何使用自定义比较器对整数数组进行排序?

2022-08-31 10:45:52

我需要使用自定义比较器对 int 数组进行排序,但是 Java 的库没有为具有比较器的 int 提供排序函数(比较器只能与对象一起使用)。有什么简单的方法可以做到这一点吗?


答案 1

如果无法更改输入数组的类型,则以下方法将起作用:

final int[] data = new int[] { 5, 4, 2, 1, 3 };
final Integer[] sorted = ArrayUtils.toObject(data);
Arrays.sort(sorted, new Comparator<Integer>() {
    public int compare(Integer o1, Integer o2) {
        // Intentional: Reverse order for this demo
        return o2.compareTo(o1);
    }
});
System.arraycopy(ArrayUtils.toPrimitive(sorted), 0, data, 0, sorted.length);

这使用 commons-lang 项目中的 ArrayUtils 在 和 之间轻松转换,创建数组的副本,执行排序,然后将排序后的数据复制到原始数据上。int[]Integer[]


答案 2

使用流(Java 8)怎么样?

int[] ia = {99, 11, 7, 21, 4, 2};
ia = Arrays.stream(ia).
    boxed().
    sorted((a, b) -> b.compareTo(a)). // sort descending
    mapToInt(i -> i).
    toArray();

或就地:

int[] ia = {99, 11, 7, 21, 4, 2};
System.arraycopy(
        Arrays.stream(ia).
            boxed().
            sorted((a, b) -> b.compareTo(a)). // sort descending
            mapToInt(i -> i).
            toArray(),
        0,
        ia,
        0,
        ia.length
    );

推荐