有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我对复制2D数组感到困惑

我读了这篇关于堆栈溢出的文章: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)我们为什么要放地图。第一组方括号中的长度,但不是映射[0]。第二组方括号中int[][] copy = new int[Map.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) 个答案

  1. # 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) Why do we put the Map.length in the first set of square brackets but not Map[0].length in the second set of square brackets for int [][] copy = new int[Map.length][]; ?

    因为我们从一个映射数组开始。长度int[],然后一次克隆一个int[]

    Don't we have to initialize the length of the columns as well?

    不,因为当我们在Map中遍历每个int[]时,我们只是使用clone()来复制它:copy[i] = Map[i].clone()

    By cloning the columns one column at a time and putting it into our 2D array it sets the length of the columns for us?

    “列”只是一个概念,它只与表格数据(特定上下文中的列主要表格数据)相关。不管怎样,“设置长度”并不准确,因为它意味着一开始就存在被设置长度的东西;但是当你做int x[][] = new x[5][]的时候,x[0]就是null,直到你把它分配给某个东西。通过一次克隆int[]的一个,我们只是。。。一次克隆一个。所以,是的,每个克隆都将与原始克隆大小相同

    3) Could we reverse this code by doing this

    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) Also copy[i] ? This is a 2D array, so shouldn't it be copy[i][] ? Or something like that.

    不,应该是copy[i]。我将把找出原因作为练习