Клонирование двумерных массивов в Java

Я знаю, что задавались аналогичные вопросы, но, прочитав их ответы, я по-прежнему не могу решить свою проблему: мне нужно реализовать клон метода 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

Что вы имеете в виду под «не сработало»? Вы получаете какую-нибудь ошибку? Подсказка: вам, вероятно, понадобятся две петли, одна внутри другой.

sp00m 07.12.2018 12:17
new double[a.length][a.length] это не так. Ваше решение учитывает только одно измерение a как для размеров размеров b, так и для копирования элементов.
Tim 07.12.2018 12:18

@TimCastelijns да, я думал, что это может быть проблемой, как мне это сделать вместо этого?

user9955719 07.12.2018 12:19

@ sp00m отредактировал, моя плохая

user9955719 07.12.2018 12:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 695
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Что-то вроде этого должно работать (с библиотечным методом):

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

Я считаю, что в моем вопросе говорится, что мне не разрешено использовать библиотечный метод для клонирования массива.

user9955719 07.12.2018 12:23

Метод clone принадлежит к `Object; нет проблем.

Joop Eggen 07.12.2018 12:35
Ответ принят как подходящий

вы должны перебрать этот массив двумя циклами. Это поможет вам:

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 пуст.

Tim 07.12.2018 12:22

правда, @TimCastelijns, тогда какой подход будет наиболее подходящим?

user9955719 07.12.2018 12:23

@TimCastelijns да, я исправил свой ответ. Теперь нормально?

Mohsen 07.12.2018 12:28

@PabloBiedma Я думаю, что мой обновленный ответ верен, братан

Mohsen 07.12.2018 12:29

Да @Spara Я думаю, что это решило задачу, и я отметил это как правильное, пожалуйста, проголосуйте за мой вопрос, аххаха

user9955719 07.12.2018 12:32

@PabloBiedma хороший вопрос! проголосовали за

Mohsen 07.12.2018 12:33

У вас есть логические ошибки:

1. Размер матрицы может быть M x N, где M - количество строк, а N - количество столбцов. В своем решении вы принимаете как должное, что M всегда равен N.

2. Вы выполняете итерацию по всем строкам, и там вы устанавливаете только один столбец на строку, например target[K][K] = source[K][K] -> это будет копировать только диагональ, а не всю матрицу.

Хорошо, я понимаю, как мне тогда это сделать, чтобы скопировать матрицу whoe и в случае, если m и n разные?

user9955719 07.12.2018 12:28

Как указывали другие ответы: для получения 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] на каждой итерации.

dbl 07.12.2018 12:34

Скопируйте во временный массив с одной строкой, а затем назначьте его выходному массиву

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

Просто забей, это не новый вопрос

Tim 07.12.2018 13:53

Другие вопросы по теме