我很困惑复制2D数组

时间:2014-03-06 03:50:46

标签: java multidimensional-array

我正在阅读有关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][]吗?或类似的东西。

1 个答案:

答案 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]。我会留下原因作为练习。