【问题标题】:How to deep copy 2 dimensional array (different row sizes)如何深度复制二维数组(不同的行大小)
【发布时间】:2011-07-30 14:35:09
【问题描述】:

这是我在这样的社区中的第一个问题,所以我有问题的格式可能不是很好,首先抱歉。

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

int[][] copyArray = new int[row][column]

因为行大小不固定,每行索引的变化比如我尝试复制这个数组:

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

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

【问题讨论】:

    标签: java arrays deep-copy dimension


    【解决方案1】:

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

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

    有帮助吗?

    【讨论】:

    • 哦,这些信息会有所帮助。我从没想过在不同的时间初始化维度
    【解决方案2】:

    你可能需要这样的东西:

    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);
      }
    }
    

    【讨论】:

    • 你提出的代码是浅拷贝,不是吗? arraycopy 会将环境数组的每个值复制到新的数组中。它是:它会将引用复制到原始行。它不会复制子数组。
    • @rlibby 和@Helios,你们确定它会进行浅拷贝吗?我认为是做一个深拷贝。在那种情况下,让我重新审视。我可能错了。感谢您指出。
    • 它是浅拷贝,您正在复制对一维数组的引用,您可以通过在代码后添加以下内容来检查:envoriment[2][0] = 5;并检查 copyArray[2][0] 现在也是 5
    【解决方案3】:

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

    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;
    }
    

    【讨论】:

    • 太棒了,这就是我所寻求的。感谢他们帮助我的所有答案:)
    【解决方案4】:

    Java 8 lambda 让这一切变得简单:

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

    你也可以在JDK-8056051 固定后写.map(int[]::clone),如果你觉得这样更清楚的话。

    【讨论】:

      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多