簡體   English   中英

Java Arrays.sort()方法需要一維數組,但我也可以傳遞一個二維數組,那為什么我不能做int [] a = b(其中b是一個二維數組)?

[英]Java Arrays.sort() method takes 1D arrays, but I can pass a 2D array as well then why can't I do int[] a=b(where b is a 2D array)?

我很難理解我可以將2D數組傳遞給java的Arrays.sort()方法的概念。(我已經看過java文檔,sort方法只能采用1D數組)
但是當我嘗試以下代碼時,我得到錯誤

int[][] b={{1,2},{2,3}};
int[] a=b;

但以下代碼工作正常

int[][] temp = { { 1, 50, 5 }, { 2, 30, 8 }, { 3, 90, 6 },{ 4, 20, 7 }, { 5, 80, 9 }, };
Arrays.sort(temp, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
    return Integer.compare(o2[1], o1[1]);
}
});

Java沒有真正的2D數組。 它具有1D陣列的一維陣列。 這意味着只要為int [] []元素傳遞比較器,就可以將int [] [] []傳遞給Arrays.sort。

例如

int[][][] a = { ... }
int[][] b = a[0];
int[] c = b[0];
int d = c[0];

你也可以寫

Object[] x = a; // as int[][] is an Object.
Object[] y = b; // as int[] is an Object.
Object[] z = c; // doesn't compile. as int is not an Object.

sort方法的簽名是 - Arrays.sort(T[], Comparator<? super T>) 當使用int[][]Comparable<int[]>作為參數調用此方法時,類型T被推斷為int[] ,這很好,因為數組只是一個對象。

但是,第一段代碼無法編譯,因為您要將int[][]賦值給int[] 它類似於將T類型賦給T[]數組。 這是不可能的,因為它們是不兼容的類型。

在你認為的意義上,Java中沒有“2D數組”。 int[][]是一個數組,其中每個元素都是int[] int[]是一個數組,其中每個元素都是一個int

由於int[]int是不同的類型,因此您的賦值不起作用。

您正在嘗試將二維數組分配給單維數組引用。 Java沒有2D數組。 它只有1D陣列或1D陣列。 您的分配參考應該能夠保持右側的類型。

int[][] b={{1,2},{2,3}};
int[] a=b;

它們是不兼容的類型,導致編譯錯誤。 你必須像這樣糾正它

 int[][] a = b;

您不能在一維數組中放置二維數組。 這個

int[][] b={{1,2},{2,3}};
int[] a=b[0];

將工作

排序這將檢查所有元素。

    int[][] temp = { { 1, 50, 5 }, { 2, 30, 8 }, { 3, 90, 6 },{ 4, 20, 7 }, { 5, 80, 9 }, };
    Arrays.sort(temp, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        for(int i=0;i<((o1.length<o2.length)?o1.length:o2.length);i++) {
            if (o1[i]!=o2[i])
                return o1[i]-o2[i];
        }
        if (o1.length!=o2.length)
            return o1.length-o2.length;
        return 0;
    }
    });

如果你想對內部數組進行排序,你需要首先在每個數組上調用sort,但這樣做會做雙重工作並且可以改進。

    int[][] temp = { { 1, 50, 5 }, { 2, 30, 8 }, { 3, 90, 6 },{ 4, 20, 7 }, { 5, 80, 9 }, };
    Arrays.sort(temp, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        Arrays.sort(o1);
        Arrays.sort(o2);
        for(int i=0;i<((o1.length<o2.length)?o1.length:o2.length);i++) {
            if (o1[i]!=o2[i])
                return o1[i]-o2[i];
        }
        if (o1.length!=o2.length)
            return o1.length-o2.length;
        return 0;
    }
    });     

在2D數組排序示例中,您只是通過檢查第二個元素並比較它們來比較兩個1D數組。 (請注意,數組中的索引從0開始)。 所以它必將發揮作用。

刪除該自定義比較器,您將獲得一個虛假的排序數組。

但你肯定不能將原始2D數組作為原始1D數組引用,因為編譯器知道它們的類型並會給你錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM