java 二维数组 排序_二维数组排序

本文介绍了如何在Java中对二维数组进行排序,主要涉及两种方法:一是通过重写Arrays.sort方法,按照二维数组中每个一维数组的首个元素进行升序排序,相同情况下再依据第二个元素排序;二是使用lambda简化重写过程。示例代码详细展示了排序过程。
摘要由CSDN通过智能技术生成

参考:

https://www.cnblogs.com/rujianming/p/11779922.html

https://blog.csdn.net/westwewe/article/details/103515556

https://blog.csdn.net/chao_ji_cai/article/details/100072293

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

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

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

Arrays.sort(a, new Comparator() {

@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]则表示为降序。

Java二维数组排序的简单实现

方法一:重写Arrays.sort方法

待排序的数组形式int[][] array = new int[n][2],其中n为任意整数。排序逻辑为:按第一列升序排列;若第一列数字相等,按第二列升序排列。

importjava.util.Arrays;importjava.util.Comparator;public classSort {public static int[][] mySort(int[][] array){//新建一个比较器Comparator作为匿名内部类

Arrays.sort(array, new Comparator() {

@Overridepublic int compare(int[] o1, int[] o2) {if(o1[0] == o2[0]){//若俩数组的第一个元素相等,则比较它们的第二个元素

return o1[1] - o2[1];

}else{//若俩数组的第一个元素不相等,则按从小到大的顺序排列

return o1[0] - o2[0];

}

}

});returnarray;

}public static voidmain(String[] args){//输入测试数据

int[][] arr = new int[][]{{1,3},{2,4}, {2,6},{8,10},{8,18}, {15,18}};int[][] sorted =mySort(arr);//输出测试结果

for(int[] a : sorted){

System.out.println(a[0] + "," + a[1]);

}

}

}

方法二:简化版重写Arrays.sort方法

importjava.util.Arrays;public classSort {public static int[][] mySort(int[][] array){

Arrays.sort(array, (arr1, arr2)-> arr1[0] == arr2[0] ? arr1[1] - arr2[1] : arr1[0] - arr2[0]);//lambda:Arrays.sort(matrix, (a, b) -> a[0] - b[0]);returnarray;

}public static voidmain(String[] args){int[][] arr = new int[][]{{1,3},{2,4}, {2,6},{8,10},{8,18}, {15,18}};int[][] sorted =mySort(arr);for(int[] a : sorted){

System.out.println(a[0] + "," + a[1]);

}

}

}

排序结果

1,3

2,4

2,6

8,10

8,18

15,18

使用Arrays.sort对二维数组分别按行和列排序(Java)

按行排序:

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

private static int [][] sortRows(int[][] arr) {//行排序

for (int i = 0; i < arr.length; i++) {

Arrays.sort(arr[i]);

}

return arr;

}

执行结果:

原数组:[323, 336, 169, 841, 744]

原数组:[590, 340, 204, 386, 405]

原数组:[152, 646, 765, 520, 891]

按行排序:[169, 323, 336, 744, 841]

按行排序:[204, 340, 386, 405, 590]

按行排序:[152, 520, 646, 765, 891]

按指定列排序:

使用比较器创建内部类:

Arrays.sort(arr, new Comparator() {//按二维数组每一行第一列,对列进行排序

@Override

public int compare(int[] o1, int[] o2) {

return o1[0] - o2[0];

}

});

关注每一行的第一位,即是列的顺序

原数组:[323, 336, 169, 841, 744]

原数组:[590, 340, 204, 386, 405]

原数组:[152, 646, 765, 520, 891]

按列排序:[152, 646, 765, 520, 891]

按列排序:[323, 336, 169, 841, 744]

按列排序:[590, 340, 204, 386, 405]

对列排序(从小到大),使用比较器创建内部类:

Arrays.sort(arr, new Comparator() {

//按二维数组每一行第二列,对列进行排序

@Override public int compare(int[] o1, int[] o2) { return o1[1] - o2[1]; } });

关注每一行的第2位,此顺序为列的顺序

原数组:[962, 852, 375, 332, 644]

原数组:[829, 811, 387, 132, 984]

原数组:[618, 859, 871, 448, 686]

按列排序:[829, 811, 387, 132, 984]

按列排序:[962, 852, 375, 332, 644]

按列排序:[618, 859, 871, 448, 686]

如果想要按列从大到小排序:

Arrays.sort(arr, new Comparator() {

@Override

public int compare(int[] o1, int[] o2) {

return o2[1] - o1[1];

}

});

最简单的写法:使用lambda表达式

对行:Arrays.sort(arr, Comparator.comparingInt(o -> o[0]));

对列:Arrays.sort(arr, Comparator.comparingInt(o -> o[1]));

排序代码以及执行结果:

importjava.util.Arrays;public classTwoArrays {public static voidmain(String[] args) {int[][] arr = new int[3][5];for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {//生成随机数【100-1000】

arr[i][j] = (int) (Math.random() * (1000 - 100 + 1) + 100);

System.out.print(arr[i][j]+" ");

}

}

System.out.println();

System.out.println();for (int i = 0; i < arr.length; i++) {

System.out.println(Arrays.toString(arr[i]));

}

System.out.println();for (int i = 0; i < arr.length; i++) {

Arrays.sort(arr[i]);

}for (int i = 0; i < arr.length; i++) {

System.out.println(Arrays.toString(arr[i]));

}

System.out.println();for(int i=0;i

System.out.print( arr[i][0]+" ");

}

System.out.println();

System.out.println();

System.out.println(Arrays.toString(arr));//打印的是对象

}

}

执行结果:

418 616 326 604 123 493 520 629 235 885 186 383 337 875 585[418, 616, 326, 604, 123]

[493, 520, 629, 235, 885]

[186, 383, 337, 875, 585]

[123, 326, 418, 604, 616]

[235, 493, 520, 629, 885]

[186, 337, 383, 585, 875]123 235 186[[I@1517365b, [I@4fccd51b, [I@44e81672]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值