为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2019-11-14 09:53:27
我需要使用自定义比较器对整数数组进行排序,但是Java的库没有为具有比较器的整数提供排序功能(比较器只能与对象一起使用)。有没有简单的方法可以做到这一点?
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

如果您无法更改输入数组的类型,则可以执行以下操作:


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

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


查看完整回答
反对 回复 2019-11-14
?
跃然一笑

TA贡献1826条经验 获得超6个赞

使用流(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

    );


查看完整回答
反对 回复 2019-11-14
?
弑天下

TA贡献1818条经验 获得超8个赞

如果您不想复制数组(例如,数组很大),则可能需要创建一个List<Integer>可用于排序的包装器:


final int[] elements = {1, 2, 3, 4};

List<Integer> wrapper = new AbstractList<Integer>() {


        @Override

        public Integer get(int index) {

            return elements[index];

        }


        @Override

        public int size() {

            return elements.length;

        }


        @Override

        public Integer set(int index, Integer element) {

            int v = elements[index];

            elements[index] = element;

            return v;

        }


    };

现在,您可以使用自定义比较器对此包装器列表进行排序。


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 740 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信