在 Java 中克隆二维数组

Cloning two-dimensional Arrays in Java

我知道有人问过类似的问题,但看完他们的回答后,我一直无法解决我的问题:我需要实现 Java 方法克隆,它将所有双条目复制到一个将二维数组 a 赋给新创建的相同类型和大小的二维数组。此方法将数组 a 作为输入,returns 具有复制值的新数组。

重要提示:不允许我使用库方法来克隆数组。

这是我到目前为止所做的:也许我不理解要求但它没有用:

class Solution {
    static double[][] clone(double[][] a) {
        double[][] b = new double[a.length][a.length];
        for (int i = 0; i < a.length; i++) {
            b[i][i] = a[i][i];
        }
        return b;
    }
}

这是我收到的错误消息:

Status: Done
cloneLonger(weblab.UTest) failed: 'java.lang.AssertionError: expected:<3> but was:<2>'
Test score: 2/3

像这样的东西应该可以工作(使用库方法):

public class Util{

  // clone two dimensional array
  public static boolean[][] twoDimensionalArrayClone(boolean[][] a) {
    boolean[][] b = new boolean[a.length][];
    for (int i = 0; i < a.length; i++) {
      b[i] = a[i].clone();
    }
    return b;
  }
}

你应该用两个循环迭代这个数组。这将帮助您:

static double[][] clone(double[][] a) {
    double[][] b = new double[a.length][];
    for (int i = 0; i < a.length; i++) {
        b[i]= new double[a[i].length];
        for (int j = 0; j < a[i].length; j++)
            b[i][j] = a[i][j];
    }
    return b;
}

你有一些逻辑错误:

1. 矩阵的大小可以是 M x N,其中 M 是行数,N 是列数。在您的解决方案中,您理所当然地认为 M 始终等于 N

2. 您正在遍历所有行,并且每行只设置一列,如 target[K][K] = source[K][K] -> 这将只复制对角线而不是整个矩阵。

复制到临时单行数组,然后将其分配给输出数组

static double[][] clone(double[][] a) {
    double[][] b = new double[a.length][];
    for (int i = 0; i < a.length; i++) {
        double[] temp = new double[a[i].length];
        for (int j = 0; j < temp.length; j++) {
            temp[j] = a[i][j];
        }
        b[i] = temp;
    }
    return b;
}

你不能那样创建新数组。如果您确定数组的长度和宽度相同,那么只有这样才有效。

class Solution {
    static double[][] clone(double[][] a) {
        boolean[][] b = new boolean[a.length][];
        for (int i = 0; i < a.length; i++) {
            b[i] = new double[a[i].length];
            for (int j = 0; i < a[i].length; j++) {
                  b[i][j] = a[i][j];
            }
        }
        return b;
    }
}

在这方面,您的代码几乎没有错误。这些更正是在下面完成的。二维数组有 2 个长度。在这种情况下,您没有考虑内部数组长度。

class Solution {
    static double[][] clone(double[][] a) {
        double[][] b = new double[a[0].length][a.length];
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
               b[i][j] = a[i][j];
            }
        }
        return b;
    }
}

更多 "advanced" 备选方案是:

static double[][] clone(double[][] a) {
    double[][] b = new double[a.length][];
    for (int i = 0; i < a.length; i++) {
        b[i] = new double[a[i].length];
        //for (int j = 0; j < a[i].length; ++j) {
        //    b[i][j] = a[i][
        //}
        System.arraycopy(a[i], 0, b[i], a[i].length);
    }
    return b;
}

现在有一个实用程序 class Arrays 值得知道:

static double[][] clone(double[][] a) {
    double[][] b = new double[a.length][];
    for (int i = 0; i < a.length; i++) {
        b[i] = Arrays.copyOf(a[i], 0, [a[i].length]);
    }
    return b;
}

对于原始数组,clone 方法仍然可以使用。克隆不是很纯粹,绕过构造函数,将来可能会从 java 中删除。

static double[][] clone(double[][] a) {
    double[][] b = new double[a.length][];
    for (int i = 0; i < a.length; i++) {
        b[i] = a[i].clone();
    }
    return b;
}