在 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;
}
我知道有人问过类似的问题,但看完他们的回答后,我一直无法解决我的问题:我需要实现 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;
}