我正在阅读有关Stack溢出的帖子:copy a 2d array in java我对克隆方法在这里的工作方式有点困惑......
public int[][] CopyMap(int[][] Map)
{
int [][] copy = new int[Map.length][];
for(int i = 0; i < Map.length; i++)
copy[i] = Map[i].clone();
return copy;
}
我知道如何使用增强型for循环进行复制,但我想完全理解这种方式。
1)为什么我们将Map.length放在第一组方括号中,而不放在int[][] copy = new int[Map.length][];
的第二组方括号中的Map [0] .length?我们不必也要初始化列的长度吗?我猜我们不能克隆2D数组,但我们可以一次克隆一行或一列。
2)通过一次克隆一列并将其放入我们的2D数组中,它为我们设置了列的长度?
3)我们可以通过这样做来反转这段代码吗
public int[][] CopyMap(int[][] Map)
{
int [][] copy = new int[][Map[0].length];
for(int i = 0; i < Map[0].length; i++)
copy[i] = Map[i].clone();
return copy;
}
4)还copy[i]
?这是一个2D数组,所以它不应该是copy[i][]
吗?或类似的东西。
答案 0 :(得分:1)
在Java中,2D数组本质上是一个数组数组(可能具有不同的长度)。重要的是要记住这一点。例如,这没关系:
int[][] ar = new int[2][];
ar[0] = new int[8]; // ar[0][0..7]
ar[1] = new int[4]; // ar[1][0..3]
语法new int[8][10]
可以方便地创建8个独立的数组,每个数组包含10个元素。
如果您熟悉C:Java中的int[][]
与C中的int**
更相似。
注意:Map
是Java中变量的可怕名称;变量名通常以小写字母开头,并且还有一个非常常见的同名基本容器接口。
1)为什么我们将Map.length放在第一组方括号中,而不是Map [0] .length放在第二组方括号中为int [] [] copy = new int [Map.length] []; ?
因为我们从一个 Map.length int[]
的数组开始,然后一次克隆一个int[]
。
我们不也要初始化列的长度吗?
不,因为当我们浏览int[]
中的每个Map
时,我们只需使用clone()
复制它:copy[i] = Map[i].clone()
。
通过一次克隆一列并将其放入我们的2D数组中,它为我们设置了列的长度?
“列”只是您构建的一个概念,它仅与表格数据(特定上下文中的列主要表格数据)相关。无论如何,“设定长度”并不完全准确,因为它暗示了首先存在长度的东西;但是当你执行int x[][] = new x[5][]
时,x[0]
为null
,直到您将其分配给某事物。通过一次克隆int[]
个,我们只是......一次克隆一个。所以,是的,每个克隆将与原始克隆的大小相同。
3)我们可以通过这样做来反转这段代码吗
public int[][] CopyMap(int[][] Map) { int [][] copy = new int[][Map[0].length]; for(int i = 0; i < Map[0].length; i++) copy[i] = Map[i].clone(); return copy; }
没有;并且希望现在清楚的原因是你知道int[][]
是一个数组数组。表达式new int[][size]
没有多大意义;它说我们希望数组中的每个int[]
都有一个给定的大小,但它并没有说明数组中有多少int[]
个。由于int[] x = new int[]
错误的原因相同,这是错误的。
4)还
copy[i]
?这是一个2D数组,所以它不应该是copy[i][]
吗?或类似的东西。
不,它应该是copy[i]
。我会留下原因作为练习。