Я знаю, что задавались аналогичные вопросы, но, прочитав их ответы, я по-прежнему не могу решить свою проблему: мне нужно реализовать клон метода Java, который копирует все двойные записи в заданном двумерном массиве a в новый создан двумерный массив одного типа и размера. Этот метод принимает массив a в качестве входных данных и возвращает новый массив со скопированными значениями.
ВАЖНО: мне не разрешено использовать библиотечный метод для клонирования массива.
Вот что я сделал до сих пор: возможно, я не понял требований, но это не сработало:
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
new double[a.length][a.length] это не так. Ваше решение учитывает только одно измерение a как для размеров размеров b, так и для копирования элементов.
@TimCastelijns да, я думал, что это может быть проблемой, как мне это сделать вместо этого?
@ sp00m отредактировал, моя плохая




Что-то вроде этого должно работать (с библиотечным методом):
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;
}
}
Я считаю, что в моем вопросе говорится, что мне не разрешено использовать библиотечный метод для клонирования массива.
Метод clone принадлежит к `Object; нет проблем.
вы должны перебрать этот массив двумя циклами. Это поможет вам:
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;
}
это будет работать, только если a представляет собой квадратную сетку, что не задано. Также произойдет сбой, если a пуст.
правда, @TimCastelijns, тогда какой подход будет наиболее подходящим?
@TimCastelijns да, я исправил свой ответ. Теперь нормально?
@PabloBiedma Я думаю, что мой обновленный ответ верен, братан
Да @Spara Я думаю, что это решило задачу, и я отметил это как правильное, пожалуйста, проголосуйте за мой вопрос, аххаха
@PabloBiedma хороший вопрос! проголосовали за
У вас есть логические ошибки:
1. Размер матрицы может быть M x N, где M - количество строк, а N - количество столбцов. В своем решении вы принимаете как должное, что M всегда равен N.
2. Вы выполняете итерацию по всем строкам, и там вы устанавливаете только один столбец на строку, например target[K][K] = source[K][K] -> это будет копировать только диагональ, а не всю матрицу.
Хорошо, я понимаю, как мне тогда это сделать, чтобы скопировать матрицу whoe и в случае, если m и n разные?
Как указывали другие ответы: для получения M -> source.length; получить N -> source[0].length; // Returns the length of first item from the source array.; Используйте два цикла for -> один, который проходит от 0 до M (i), а другой - вложенный, от 0 до N (j). Устанавливайте target[i][j] = source[i][j] на каждой итерации.
Скопируйте во временный массив с одной строкой, а затем назначьте его выходному массиву
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;
}
}
Еще более «продвинутые» альтернативы:
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;
}
Теперь стоит изучить служебный класс 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;
}
Просто забей, это не новый вопрос
Что вы имеете в виду под «не сработало»? Вы получаете какую-нибудь ошибку? Подсказка: вам, вероятно, понадобятся две петли, одна внутри другой.