【问题标题】:Creating a copy of a multi-dimensional array [duplicate]创建多维数组的副本[重复]
【发布时间】:2019-08-18 16:36:26
【问题描述】:

我正在尝试创建一个多维数组的副本,这样对新数组的任何修改都不会影响原始数组。

这是我的代码:

public static int[][] getNextGenUniverse(int[][] validUniverse) {

    // Create a copy of the original array

    int[][] nextUniverse = new validUniverse[][];

    // Iterate through all the elements of the array

    for (int i = 0; i < nextUniverse.length; i++) {

      // Iterate through all the elements of the subarrays

      for (int j = 0; j < nextUniverse[i].length; j++) {

      nextUniverse[i][j] = validUniverse[i][j];
      }
    }
}

我在声明新数组的长度时遇到了问题。有人可以帮帮我吗?

【问题讨论】:

  • “对新数组的任何修改都不会影响原始数组”是什么意思?您是指浅拷贝,其中更改新数组的内容不会更改另一个数组的内容,还是您的意思是深拷贝,其中修改对象 inside 新数组不会修改对象 旧数组里面?
  • @Mike'Pomax'Kamermans 我的意思是改变新数组的一个元素不会改变原数组的对应元素。
  • 那里仍然存在一些歧义,因为“更改元素”通常意味着执行类似arr[i].setValue() 之类的操作,这将更新该对象,而不管它在什么位置。所以做到了您的意思是浅拷贝,其中数组不同,但它们指向相同的对象,或者您的意思是深拷贝,其中 所有涉及的数据 被复制,并且在复制后立即已经存在两个数组指向的任何数据之间没有关系? (例如“您只想要图书馆的索引书的副本,还是想要复制整个图书馆,包括所有书籍”)

标签: java multidimensional-array


【解决方案1】:

它应该与validUniverse 的长度相同。您可以使用Arrays.copyOf(int[], int) 执行复制。喜欢,

public static int[][] getNextGenUniverse(int[][] validUniverse) {
    int[][] r = new int[validUniverse.length][];
    for (int i = 0; i < validUniverse.length; i++) {
        r[i] = Arrays.copyOf(validUniverse[i], validUniverse[i].length);
    }
    return r;
}

【讨论】:

  • 如果我只更改新数组大小的声明,我的代码应该没问题? Arrays.copyOf(int[], int) 语句是可选的,对吧?
  • 或多或少,是的。但是,Elliott 的解决方案适用于复制所有不想破坏您的计算机的矩阵。
  • @ElliotFrisch 你不必初始化子数组的长度,因为我仍然得到一个 NullPointerException
猜你喜欢
  • 2012-11-25
  • 2018-11-30
  • 1970-01-01
  • 2018-11-30
  • 2019-07-18
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多