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

Posted 是渣渣呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
            
        );

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

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

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


再点到mergeSort()方法里

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

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

那么,这个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个元素的一维数组)

以上是关于Java对二维数组进行排序及源码分析的主要内容,如果未能解决你的问题,请参考以下文章

java中怎么对二维数组的列排序?

sort int[][] 二维数组排序

二维,多维数组排序array_multisort()函数的使用

Vector容器 二维数组sort()排序

thinkPHP二维数组排序

7.Java集合-Arrays类实现原理及源码分析