Arrays.copyof соединяет два массива [duplicate]

Исправить исключение NullReferenceException можно с помощью Null-условных операторов в c # 6 и написать меньше кода для обработки нулевых проверок.

Он используется для проверки нуля до выполнения доступа к члену (?. ) или index (? [).

Пример

  var name = p?.Spouse?.FirstName;

эквивалентен:

    if (p != null)
    {
        if (p.Spouse != null)
        {
            name = p.Spouse.FirstName;
        }
    }

В результате имя будет нулевым когда p равно null или когда p.Spouse имеет значение null.

В противном случае имени переменной будет присвоено значение p.Spouse.FirstName.

Для получения дополнительной информации: Операторы с нулевым условием

30
задан badcoder 11 April 2011 в 06:15
поделиться

10 ответов

current=old или old=current заставляют два массива ссылаться на одно и то же, поэтому, если впоследствии вы измените current, old также будет изменен. Чтобы скопировать содержимое массива в другой массив, используйте цикл for

for(int i=0; i<old.length; i++)
  for(int j=0; j<old[i].length; j++)
    old[i][j]=current[i][j];

PS: для одномерного массива вы можете избежать создания собственного цикла for, используя Arrays.copyOf

33
ответ дан Sébastien 28 August 2018 в 18:50
поделиться

Вот как вы можете это сделать, используя циклы.

public static int[][] makeCopy(int[][] array){
    b=new int[array.length][];

    for(int row=0; row<array.length; ++row){
        b[row]=new int[array[row].length];
        for(int col=0; col<b[row].length; ++col){
            b[row][col]=array[row][col];
        }
    }
    return b;
}
0
ответ дан Arafe Zawad Sajid 28 August 2018 в 18:50
поделиться
/**
 * Clones the provided array
 * 
 * @param src
 * @return a new clone of the provided array
 */
public static int[][] cloneArray(int[][] src) {
    int length = src.length;
    int[][] target = new int[length][src[0].length];
    for (int i = 0; i < length; i++) {
        System.arraycopy(src[i], 0, target[i], 0, src[i].length);
    }
    return target;
}

Возможно ли изменить этот код для поддержки n-мерных массивов объектов?

Вам нужно будет поддерживать произвольные длины массивов и проверить, не является ли src и пункт назначения имеют одинаковые размеры, и вам также потребуется скопировать каждый элемент каждого массива рекурсивно , если объект также был массивом.

Прошло некоторое время с тех пор, как я опубликовано это, но я нашел хороший пример для создания n-мерного класса массива. Класс принимает нуль или более целых чисел в конструкторе, задавая соответствующий размер каждого измерения. Класс использует базовый flat массив Object[] и вычисляет индекс каждого элемента, используя размеры и массив множителей. (Это то, как массивы выполняются на языке программирования C.)

Копирование экземпляра NDimensionalArray было бы таким же простым, как копирование любого другого 2D-массива, хотя вам необходимо утверждать, что каждый объект NDimensionalArray имеет равные размеры. Это, вероятно, самый простой способ сделать это, поскольку нет рекурсии, и это делает представление и доступ намного проще.

20
ответ дан Community 28 August 2018 в 18:50
поделиться

Я решил написать простую функцию для копирования многомерных int-массивов с использованием System.arraycopy

public static void arrayCopy(int[][] aSource, int[][] aDestination) {
    for (int i = 0; i < aSource.length; i++) {
        System.arraycopy(aSource[i], 0, aDestination[i], 0, aSource[i].length);
    }
}

или на самом деле я улучшил ее для моего варианта использования:

/**
 * Clones the provided array
 * 
 * @param src
 * @return a new clone of the provided array
 */
public static int[][] cloneArray(int[][] src) {
    int length = src.length;
    int[][] target = new int[length][src[0].length];
    for (int i = 0; i < length; i++) {
        System.arraycopy(src[i], 0, target[i], 0, src[i].length);
    }
    return target;
}
6
ответ дан Daniel Backman 28 August 2018 в 18:50
поделиться

Вы также можете сделать следующее:

public static int[][] copy(int[][] src) {
    int[][] dst = new int[src.length][];
    for (int i = 0; i < src.length; i++) {
        dst[i] = Arrays.copyOf(src[i], src[i].length);
    }
    return dst;
}
2
ответ дан Johnny Lim 28 August 2018 в 18:50
поделиться

Вы можете дать код ниже,

public void multiArrayCopy(int[][] source,int[][] destination){
destination=source.clone();}

Надеюсь, что он работает.

-4
ответ дан kaibuki 28 August 2018 в 18:50
поделиться
current = old ;

Операции присваивания не копируют элементы одного массива в другой. Вы просто делаете матрицу current ссылкой на матрицу old. Вам нужно сделать мудрый экземпляр участника.

0
ответ дан Mahesh 28 August 2018 в 18:50
поделиться

Я использую эту функцию:

public static int[][] copy(final int[][] array) {
    if (array != null) {
        final int[][] copy = new int[array.length][];

        for (int i = 0; i < array.length; i++) {
            final int[] row = array[i];

            copy[i] = new int[row.length];
            System.arraycopy(row, 0, copy[i], 0, row.length);
        }

        return copy;
    }

    return null;
}

Большим преимуществом этого подхода является то, что он также может копировать массивы, которые не имеют одинакового количества строк, например:

final int[][] array = new int[][] { { 5, 3, 6 }, { 1 } };
0
ответ дан Niklas 28 August 2018 в 18:50
поделиться

Массивы в java - это объекты, а все объекты переданы по ссылке . Чтобы действительно «скопировать» массив, вместо создания другого имени для массива, вам нужно пойти и создать новый массив и скопировать все значения. Обратите внимание, что System.arrayCopy полностью копирует 1-мерные массивы, но НЕ 2-мерные массивы. Причина в том, что 2D-массив на самом деле является 1D массивом из 1D-массивов, а arrayCopy копирует по указателям на одни и те же внутренние массивы 1D.

0
ответ дан Sajid 28 August 2018 в 18:50
поделиться
public  static byte[][] arrayCopy(byte[][] arr){
    if(arr!=null){
        int[][] arrCopy = new int[arr.length][] ;
        System.arraycopy(arr, 0, arrCopy, 0, arr.length);
        return arrCopy;
    }else { return new int[][]{};}
}
0
ответ дан Satish 28 August 2018 в 18:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: