Java对二维数组进行排序及源码分析

调用API

假设我们要对二维数组int[][] intervals里的一维数组按照每个一维的数组下标为 i 的元素进行升序 / 降序排序

int[][] intervals;
Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] interval1, int[] interval2) {
                return interval1[0] - interval2[0];
            }
        });

注:

  1. Comparator<> 里的泛型要写int[], 因为我们是对每个一维数组进行排序的!
  2. int[] interval1指的是二维数组里前一个位置的一维数组
  3. int[] interval2 指的是二维数组里后一个位置的一维数组
  4. 然后我们要按一维数组的首元素进行排序,所以是interval1[0] 和 interval2[0]! ! !
  5. 升序的话就是 interval1[0] - interval2[0] ; 降序就interval2[0] - interval1[0] !
  6. 如果是按每个一维的数组下标为 i 的元素,就把 0 改成 i(注:i是具体的数字1,2,3。。)

源码分析

注:我们的目的是对二维数组中的一维数组按照每个一维数组首元素大小进行升序/降序排序

int[][] intervals;
Arrays.sort(intervals, new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
                return 0;
            }
        });

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210417215919264.png

按住Ctrl+A点击sort方法,查看源码

在这里插入图片描述

(注: 这里T[] a, 在我们调用传入int[][]类型的intervals时,T就相当于int[])

那么,这个c到底是怎么实现的呢?我们再点到legacyMergeSort()方法里

在这里插入图片描述
在这里插入图片描述

再点到mergeSort()方法里

在这里插入图片描述

这里可以很明显的看到,调用了Comparator对象c的某个方法,叫compare(),
所以我们再点到compare()里

在这里插入图片描述

可以发现,compare()方法是接口Comparator里的一个方法,所以我们在调用sort()方法时,要new 一个匿名内部类,并且重写里面的compare()方法! 而c就指向我们new出来的类!
就像这样

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210417215919264.png

那么,这个compare()方法到底是干什么的呢?

在这里插入图片描述

根据官方的描述,我们可以知道:
如果o1 < o2 , 就返回负数
如果o1 = o2 , 就返回0
如果o1 > o2 , 就返回正数
当然,其实具体什么条件下返回正负或0 还是得看我们重写方法时怎么定义的!

那么,知道返回结果又能如何呢?我们再回到mergeSort()里!

在这里插入图片描述

可以看到,这里是说compare()返回的值 > 0并且满足一些条件的话就调用swap()方法,也就是交换(顾名思义)dest[j-1] 和 dest[j] 的位置!
就是在compare()的返回值>0 的情况下交换dest[j-1] 和 dest[j] 的位置!

因此,对应到我们的目的:

  1. 把o1,o2改成intervals1和intervals2,方便读代码;
  2. compare()方法体里的升序逻辑就是interval1[0] - interval2[0]; (如果要降序的话,就是interval2[0] - interval1[0],因为这时只有 dest[j-1] < dest[j] 了才会返回为正数)

所以,代码就是这样的了

Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] interval1, int[] interval2) {
                return interval1[0] - interval2[0];
            }
        });

到了这里,可能会有人好奇,为什么compare()里的操作就是对一维数组里的元素进行操作的呢?

其实,是在调用compare()的时候,传入的是dest[j-1] 和 dest[j],也就相当于是intervals[j-1] 和 intervals[j],
所以我们在compare()里进行操作的时候,interval1[0] 就相当于 intervals[j-1][0],interval2[0] 就相当于 intervals[j][0]
(注: Java里二维数组[m][n]就相当于m 个一维数组,每个一维数组里是n个元素的一维数组)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值