java对二维数组进行排序

一、按行排序:

对二维数组按进行排序,直接调用Arrays.sort就行:

private static int [][] sortRows(int[][] arr) {//行排序
		for (int i = 0; i < arr.length; i++) {
			Arrays.sort(arr[i]);
		}
		return arr;
	}

二、按列排序:

1.使用比较器创建内部类

按第0列,进行升序排序

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

值得一提的是,这里面用到的方法的compare的原理是这样的:

//compare
public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

对于输入的x,y:

若x<y,则返回-1(小于0的数);

若x=y,则返回0;

若x>y,则返回1(大于0的数);

在源码中,如果调用compare方法返回值大于0,就把前一个数和后一个数交换,也就是把大的数放后面了,即所谓的 升序了;如果将x,y顺序调换,就是降序了

返回值小于等于0的时候,保持前后顺序不变;

n行2列数组,先按数组的第一列进行升序排序,若某两行第一列相等,则按照第二列进一步排序:

Arrays.sort(arr, new Comparator<int[]>() {    // 匿名内部类
	@Override
	public int compare(int[] o1, int[] o2) {
		// 如果第一列元素相等,则比较第二列元素
		if (o1[0]==o2[0]) return e1[1]-e2[1];   // o1[1]-o2[1]表示对于第二列元素进行升序排序
		return o1[0]-o2[0];                     // o1[0]-o2[0]表示对于第一列元素进行升序排序
	}
});

另外提一点,当需要比较的元素接近那个元素类型的临界值时,使用相减的形式作为compare的返回值容易出现越界异常,因此建议进行if-else大小比较返回值,而不是相减:

Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[0] > o2[0])
                    return 1;
                else if(o1[0] == o2[0])
                    return 0;
                else
                    return -1;
            }
        });
2.lambda表达式实现

按第一列元素升序排序:

Arrays.sort(arr, (o1, o2) -> (o1[0] - o2[0]));   // "->"lambda表达式符号,其将参数与实现隔开

如果有数值溢出风险建议采用下面的方法:

Arrays.sort(arr,(int a[],int b[])->Integer.compare(a[0],b[0]));

这样采用的就是比较而不是作差的方式,可以一定程度上规避数值溢出的风险。

3.使用比较器静态方法
Arrays.sort(arr, Comparator.comparingInt(o -> o[0]));

Comparator.comparingInt方法创建一个比较器对象,Comparator.comparingInt方法是Java 8中Comparator接口的一个静态方法,它可以根据指定的键(即排序关键字)对对象进行排序。在这个例子中,我们通过指定o -> o[0]作为键来按照二维数组的第一列进行排序。

使用Comparator.comparingInt方法的好处是它可以更加简洁地定义比较器,同时也可以方便地添加多个排序关键字。比如,如果我们想要按照二维数组的第一列和第二列进行升序排序,可以使用以下代码:

Arrays.sort(arr, Comparator.comparingInt((int[] o) -> o[0]).thenComparingInt(o -> o[1]));

这段代码中,我们首先使用Comparator.comparingInt方法按照第一列进行排序,然后使用thenComparingInt方法按照第二列进行排序。这样就可以按照多个关键字进行排序了。

需要注意的是,使用Comparator.comparingInt方法需要注意排序键的类型。在这个例子中,我们使用了int[]作为排序键的类型,因为我们要按照一维数组的第一个元素进行排序。如果要按照其他类型的字段进行排序,需要相应地修改比较器的实现方式和排序键的类型。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值