二維數組排序


參考:

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

 

 

 

 

 

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]則表示為降序。

 

 

 

 

 

Java二維數組排序的簡單實現

方法一:重寫Arrays.sort方法

待排序的數組形式int[][] array = new int[n][2],其中n為任意整數。排序邏輯為:按第一列升序排列;若第一列數字相等,按第二列升序排列。

import java.util.Arrays;
import java.util.Comparator;

public class Sort {
    public static int[][] mySort(int[][] array){
        // 新建一個比較器Comparator作為匿名內部類
        Arrays.sort(array, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[0] == o2[0]){
                    // 若倆數組的第一個元素相等,則比較它們的第二個元素
                    return o1[1] - o2[1];
                }else {
                    // 若倆數組的第一個元素不相等,則按從小到大的順序排列
                    return o1[0] - o2[0];
                }
            }
        });
        return array;
    }
    public static void main(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方法

import java.util.Arrays;

public class Sort {
    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]);
        return array;
    }
    public static void main(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<int[]>() {//按二維數組每一行第一列,對列進行排序 @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<int[]>() {
//按二維數組每一行第二列,對列進行排序
@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<int[]>() { @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]));

 

 

 

 

 

排序代碼以及執行結果:

import java.util.Arrays;

public class TwoArrays {

    public static void main(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<arr.length;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]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM