2012-01-15 2 views
-1

У меня есть двумерный массив number2. Я установил его равным number2copy с номером2copy = number2 Затем я вызываю метод Zeroed, передавая ему массив 2d ToBeZeroed. Этот метод заполняет массив 0s, и я знаю, что он работает. Он возвращает ToBeZeroed полный нулей. Но, когда я ставлю number2 = ToBeZeroed; number2copy также заполнен нулями. Как я могу разбить эти вещи, поэтому изменение в одном не вызывает изменения в другом? Они представляют собой несвязанные массивы, поэтому их необходимо обрабатывать отдельно.Java массивы всегда равны

+0

Как насчет публикации фактического кода? –

+1

Почему бы вам написать английское описание кода вместо того, чтобы просто публиковать сам код? –

ответ

4

Java не является C++. Вы копируете ссылку на массив, приписываемый первому измерению, а не объект массива и подэлементы массива. Вам необходимо использовать number2copy = (int[][])deepCopy(number2);, который будет выполнять глубокую копию массива, которая подходит для ваших нужд, включая копии массивов второго измерения, содержащихся внутри. Замените int[][] на используемый тип данных 2D-массива, о котором вы нам не говорили :) Кроме того, чтобы проверить, равен ли один объект другому, == проверит ссылку на первый размерный массив двумерного массива, что, вероятно, не является вы хотите. Для глубокой проверки используйте Arrays.deepEquals(number2, number2copy);, который должен работать нормально.

Deep Скопировать код:

public static Object deepCopy(Object src) 
{ 
    int srcLength = Array.getLength(src); 
    Class srcComponentType = src.getClass().getComponentType(); 

    Object dest = Array.newInstance(srcComponentType, srcLength); 

    if (srcComponentType.isArray()) 
    { 
     for (int i = 0; i < Array.getLength(src); i++) 
      Array.set(dest, i, deepCopy(Array.get(src, i))); 
    } 
    else 
    { 
     System.arraycopy(src, 0, dest, 0, srcLength); 
    } 

    return dest; 
} 

См here для краткого объяснения.

Edit: Я только заметил, что он сказал 2D массив, так что модифицированный ответ надлежащим образом :)

0

Массивы в Java являются Object s и, следовательно, имеют эталонные семантику. Иными словами, операция назначения x = y;с псевдонимами и обоими x и y теперь относятся к одному и тому же фактическому объекту.

(Противоположностью что значение семантики, в результате чего значение y получает копируется к отчетливым значения x; примитивные типы, такие как int имеют семантику значений.)

Вам нужно будет сделать явный массив new и скопируйте данные.


Различие между ценностной и ссылочной семантикой является одним из наиболее важных аспектов системы Java-типа.

1

Я установил его равным number2copy с number2copy = number2

На данный момент, и с тех пор (если не присвоить другое значение для любой из этих ссылок) number2copy и number2 пункт в такой же массив. Когда вы меняете массив через одну ссылку, изменения видны через другую.

Как я могу разбить эти вещи, поэтому изменение в одном не вызывает изменения в другом?Они не имеют никакого отношения массивы, поэтому они должны быть обработаны отдельно

Ну, если они не связаны между собой массивы, то вы не должны делать number2copy = number2 ... потому что это делает их тот же массив.


Если вы хотите обнулить массив 2-D, вам нужно сделать что-то вроде этого:

for (int i = 0; i < toBeZeroed.length; i++) { 
    for (int j = 0; j < toBeZeroed[i].length; j++) { 
     toBeZeroed[i][j] = 0; 
    } 
} 

Если вы хотите скопировать массив 2-D к другому, вам нужно сделать что-то вроде этого:

for (int i = 0; i < from.length; i++) { 
    for (int j = 0; j < from[i].length; j++) { 
     to[i][j] = from[i][j]; 
    } 
} 

(Это предполагает, что from и to массивов имеют одинаковые размеры, нет нулевых Подмассивов, и так далее)

Возможно, вам захочется найти стороннюю библиотеку, в которой нули/копии массивов, как вам нужно. Однако, пока вы учитесь, вам будет полезно реализовать их самостоятельно, чтобы помочь вам получить четкую ментальную модель о работе Java; например ссылка присваивание, какой 2-D массив на самом деле, и т.д. ...


Остерегайтесь использовать clone для копирования 2-D (или больше) массива:

  • Это создает новое массив, где вы, похоже, хотите скопировать значения в одном существующем массиве в другой существующий массив.

  • Он выполняет только мелкую копию; т. е. новый массив будет делиться подмассивами оригинала, и вы окажетесь в ситуации, которую вы в настоящее время пытаетесь избежать, когда изменение одного массива влияет на другое.

Смежные вопросы