当前位置:   article > 正文

java对二维数组进行排序_java二维数组排序

java二维数组排序

一、按行排序:

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

private static int [][] sortRows(int[][] arr) {//行排序
		for (int i = 0; i < arr.length; i++) {
			Arrays.sort(arr[i]);
		}
		return arr;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

二、按列排序:

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

按第0列,进行升序排序

Arrays.sort(arr, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0] - o2[0];
    }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

对于输入的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]表示对于第一列元素进行升序排序
	}
});

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

另外提一点,当需要比较的元素接近那个元素类型的临界值时,使用相减的形式作为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;
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
2.lambda表达式实现

按第一列元素升序排序:

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

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

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

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

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

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]));
  • 1

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/413905
推荐阅读
相关标签
  

闽ICP备14008679号