java Arrays.sort()通过自己设定来排序

主要讲的就是 Comparator<? super T> c这玩意如何用

static void sort(int[] a) 对指定的 int 型数组按数字升序进行排序。 这里的int
可以是除了Object、String、Boolean类型的其他基础数据类型所替代。

那么如果我们要对某些指定类型的数组,按我们我想要的方式进行重排,着我们需要借助:

static void sort(T[] a, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组进行排序。 (这里的T是你要进行排序的对象的类型) (这里T是你要传入类型的父类,也就是你设定好T,你可以传入继承T的类)
注意:这里的Comparator<? super T> c(比较器)改变的是sort方法排序时的比较后交换条件,比如说某数组中的两个元素o1与o2 (o1的index 在o2的index之前),我们可以在比较器中设定当o1大于o2便可以交换。而不是改变sort方法的排序方法。

  • 比较的是对象而不是基础数据类型,这意味着基础数据类型的自定义比较要先转换为包装类
  • o1 与 o2 在参数列表的顺序是有意义的,这代表着它数组内部前后顺序

代码:
第一种方法,同样可以把new Comparator()摘出来用一个继承Comparator类并重写compare方法的对象来取代它。

//这里只能用Integer来表示整数数组类型。它是int的包类 也就是super T(super在Java中是父类的意思);
Integer[] s = {1 , 3, 0, 3, 6, 2, 8, 4, 14, 11};
        Arrays.sort(s, new Comparator<Integer>() {
            @Override
            //在这里主要是重写了 Comparator类的compare方法,
            //sort方法可能也用了这个方法进行排序,然后在这里被重写了。
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;//当大于0就交换,否则不交换。
            }
        });

第二种方法

Integer[] s = {1 , 3, 0, 3, 6, 2, 8, 4, 14, 11};
Arrays.sort(s,(o1,o2) -> o2 - o1);//这里用的是匿名类的labmda表达式

注意这里的o1与o2在数组里面是有顺序的,也就是o1的下标在o2的前面(也就是说compare(…)的这个参数列表是代表连续且递增的数组下标的。

那么假如是二维数组(多维数组)那么

int[][] points = {{10, 16}, {2, 8}, {1, 6}, {6, 12}};
        // 对二维数组按照每行数组的第一个元素进行排序
        Arrays.sort(points, new Comparator<int[]>() {
            @Override
            //这里是将二维数组拆分成一个个一维数组也就是points[0][]、points[1][]等等。
            public int compare(int[] o1, int[] o2) {
                // 按照每个一维数组的第一个下标的大小来排这些一维数组(排序的所交换的主体是compare里面的参数类型)
                //这里返回的值将决定是否会进行调换,正数就调,其他值则不变
                //所以我们完全可以对这两个数组内其他的数据进行更加充分的比较再决定返回什么值。
                return o1[0] - o2[0];
            }
        });

Comparator类及compare文档解释

  1. 强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序.
  2. int compare(T o1, T o2) 比较用来排序的两个参数。
  1. compare int compare(T o1, T o2)比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 在前面的描述中,符号sgn(expression) 表示 signum 数学函数,根据 expression 的值为负数、0 还是正数,该函数分别返回 -1、0 或 1。

实现程序必须确保对于所有的 x 和 y 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 才必须抛出异常。)
实现程序还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) 意味着compare(x, z)>0。

最后,实现程序必须确保 compare(x, y)==0 意味着对于所有的 z 而言,都存在 sgn(compare(x, z))==sgn(compare(y, z))。

虽然这种情况很普遍,但并不 严格要求 (compare(x, y)==0) == (x.equals(y))。一般说来,任何违背这个条件的 Comparator 都应该清楚地指出这一事实。推荐的语言是“注意:此 Comparator 强行进行与 equals 不一致的排序。”

参数: o1 - 要比较的第一个对象。 o2 - 要比较的第二个对象。
返回:
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

  • 19
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

“胡”说八道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值