一、按行排序:
對二維數組按進行排序,直接調用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[]>() {@Overridepublic 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[]>() { // 匿名內部類@Overridepublic 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[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if(o1[0] > o2[0])return 1;else if(o1[0] == o2[0])return 0;elsereturn -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[]作為排序鍵的類型,因為我們要按照一維數組的第一個元素進行排序。如果要按照其他類型的字段進行排序,需要相應地修改比較器的實現方式和排序鍵的類型。