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