Java Arrays.sort()对二维数组排序

今天在解决leetcode的合并区间出现了需要用到二维数组的排序,
突然间想起来自己对于这方面不是很懂,虽然自己可以实现,但是实现起来很麻烦,我想看看网上有没有人有好的想法或者API直接调用。

然后就被我发现了这个东西 java中Arrays.sort()对二维数组进行排序

然后就发现了新大陆,调用这个方法,完美解决二维数组排序的问题

int [][]a = new int [5][2];

//定义一个二维数组,其中所包含的一维数组具有两个元素

//对于一个已定义的二位数组a经行如下规则排序,
//首先按照每一个对应的一维数组第一个元素进行升序排序(即a[][0]),
//若第一个元素相等,则按照第二个元素进行升序排序(a[][1])。
//(特别注意,这里的a[][0]或者a[][1]在java中是不能这么定义的,
//这里只是想说明是对于某一个一维数组的第0或1个元素进行排序)

Arrays.sort(a, new Comparator<int[]>() {
	@Override
	public int compare(int[] o1, int[] o2) {
		if (o1[0]==o2[0]) 
			return o1[1]-o2[1];
		return o1[0]-o2[0];
	}
});
//其中o1[1]-o2[1]表示对于第二个元素经行升序排序如果为o2[1]-o1[1]则表示为降序。

虽然知道可以这样子使用,但是不知道原理啊,于是我准备去查一下API
然后就找到了这个:
Java Arrays.sort()对二维数组排序_第1张图片

public static <T> void sort(T[] a,
                                    Comparator<? super T> cmp)
//根据指定的比较器引发的顺序对指定的对象数组进行排序。 
//数组中的所有元素必须通过指定的比较器相互比较 
//(即c.compare(e1, e2)不能为ClassCastException中的任何元素e1和e2 )。 
//这种保证是稳定的 :等同的元素将不会被排序作为排序的结果。

大概的意思就是说,我们可以针对我们给定的数组,制定不同的规则去排序

那么这个Comparator cmp 又是个什么东西?
这里用到了下界修饰符,说明cmp对象只能add,而不能get
Java Arrays.sort()对二维数组排序_第2张图片
我们再去点进Comparator,找到compare方法
Java Arrays.sort()对二维数组排序_第3张图片
这里就是定义我们规则的地方了,我们来看一下这个方法对于返回值的描述:

比较其两个参数的顺序。 返回负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。

也就是说:
如果返回值小于零的话,第一个参数小于第二个参数
如果返回值等于0的话,两个参数相等,
如果返回值大于零的话,第一个数大于第二个参数

我要排序的数组类似于这样的:

[[2,3],[5,5],[2,2],[3,4],[3,4]]

那么我们的排序就应该是,先先比较第一个数,再比较第二个数,依次递增。
那么我们的的规则就是,先看看两个值是否相等的,如果相等的话,我们就比较第二个数。
所以我们的规则就是:

Arrays.sort(a, new Comparator<int[]>() {
	@Override
	public int compare(int[] o1, int[] o2) {
		if (o1[0]==o2[0]) 
			return o1[1]-o2[1];
		return o1[0]-o2[0];
	}
});
//其中o1[1]-o2[1]表示对于第二个元素经行升序排序如果为o2[1]-o1[1]则表示为降序。

这里我们也不难理解最后一行注释是什么意思了,对于升降排序的设置。

你可能感兴趣的:(面试)