[英]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.