Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何深度复制二维数组(不同的行大小)_Java_Arrays_Deep Copy_Dimension - Fatal编程技术网

Java 如何深度复制二维数组(不同的行大小)

Java 如何深度复制二维数组(不同的行大小),java,arrays,deep-copy,dimension,Java,Arrays,Deep Copy,Dimension,这是我在这样一个社区里的第一个问题,所以我讨论的格式可能不是很好,首先对此表示抱歉 现在我的问题是我想在Java中深度复制一个二维数组。在固定大小的行和列的一维甚至二维数组中进行操作非常容易。我的主要问题是无法对尝试复制的第二个阵列进行初始化,例如: int[][] copyArray = new int[row][column] 因为行大小不是固定的,并且每个行索引都会发生更改,例如我尝试复制此数组: int[][] envoriment = {{1, 1, 1, 1}, {0, 1, 6}

这是我在这样一个社区里的第一个问题,所以我讨论的格式可能不是很好,首先对此表示抱歉

现在我的问题是我想在Java中深度复制一个二维数组。在固定大小的行和列的一维甚至二维数组中进行操作非常容易。我的主要问题是无法对尝试复制的第二个阵列进行初始化,例如:

int[][] copyArray = new int[row][column]
因为行大小不是固定的,并且每个行索引都会发生更改,例如我尝试复制此数组:

int[][] envoriment = {{1, 1, 1, 1}, {0, 1, 6}, {1}};

所以你看,如果我说
newint[3][4]
会有我不想要的额外空格。有没有一种方法可以深度复制这种二维数组?

您不必同时初始化两个维度:

int[][] test = new int[100][];
test[0] = new int[50];

它有用吗?

您可能需要这样的东西:

public class Example {
  public static void main(String[] args) {

    int[][] envoriment = {{1, 1, 1, 1}, {0, 1, 6}, {1}};

    int[][] copyArray = new int[envoriment.length][];
    System.arraycopy(envoriment, 0, copyArray, 0, envoriment.length);
  }
}

我想你的意思是,列的大小不是固定的。无论如何,一个简单直接的方法是:

public int[][] copy(int[][] input) {
      int[][] target = new int[input.length][];
      for (int i=0; i <input.length; i++) {
        target[i] = Arrays.copyOf(input[i], input[i].length);
      }
      return target;
}
public int[][]复制(int[][]输入){
int[][]目标=新的int[input.length][];

对于(int i=0;iJava 8 lambdas,这很容易:

int[][] copy = Arrays.stream(envoriment).map(x -> x.clone()).toArray(int[][]::new);

您还可以编写
.map(int[]::clone)
after是固定的,如果你认为这更清楚的话。

你建议的代码是浅层复制,不是吗?arraycopy会将环境数组的每个值复制到新数组中。它是:它会将引用复制到原始行。它不会复制子数组。@rliby和@Helios,你们确定它会进行浅层复制吗?我Think is做了一个深度复制。在这种情况下,让我重温一下。我可能错了。谢谢你指出。这是浅层复制,你正在复制对一维数组的引用,你可以通过在你的代码后面添加这个来检查:envoriment[2][0]=5;并检查copyArray[2][0]现在也是5哦,这些信息会有帮助的。我从来没有想过在不同的时间初始化维度。太棒了,这是我通常寻求的。感谢他们帮助我的所有答案:)