У меня есть двумерный массив number2. Я установил его равным number2copy с номером2copy = number2 Затем я вызываю метод Zeroed, передавая ему массив 2d ToBeZeroed. Этот метод заполняет массив 0s, и я знаю, что он работает. Он возвращает ToBeZeroed полный нулей. Но, когда я ставлю number2 = ToBeZeroed; number2copy также заполнен нулями. Как я могу разбить эти вещи, поэтому изменение в одном не вызывает изменения в другом? Они представляют собой несвязанные массивы, поэтому их необходимо обрабатывать отдельно.Java массивы всегда равны
ответ
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 массив, так что модифицированный ответ надлежащим образом :)
Массивы в Java являются Object
s и, следовательно, имеют эталонные семантику. Иными словами, операция назначения x = y;
с псевдонимами и обоими x
и y
теперь относятся к одному и тому же фактическому объекту.
(Противоположностью что значение семантики, в результате чего значение y
получает копируется к отчетливым значения x
; примитивные типы, такие как int
имеют семантику значений.)
Вам нужно будет сделать явный массив new
и скопируйте данные.
Различие между ценностной и ссылочной семантикой является одним из наиболее важных аспектов системы Java-типа.
Я установил его равным 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 (или больше) массива:
Это создает новое массив, где вы, похоже, хотите скопировать значения в одном существующем массиве в другой существующий массив.
Он выполняет только мелкую копию; т. е. новый массив будет делиться подмассивами оригинала, и вы окажетесь в ситуации, которую вы в настоящее время пытаетесь избежать, когда изменение одного массива влияет на другое.
- 1. Java, Проверка, если два символьные массивы равны
- 2. Вычисления всегда равны 0
- 3. Элементы сеанса всегда равны нулю
- 4. Генерируемые случайные числа всегда равны
- 5. Данные NSURLSession всегда равны нулю
- 6. Может быть разделен, но идентичные массивы EVER равны по ссылке
- 7. Фотографии в JLabels всегда равны метке
- 8. Android: разделение и вычитание всегда равны 1.0
- 9. Ожидаем, что массивы равны, игнорируя порядок
- 10. Служба Java REST принимает POJO, но поля всегда равны нулю
- 11. Java-булевские значения не равны, но равны?
- 12. Мои возвращаемые значения всегда равны 0
- 13. Почему переменные цикла всегда равны 0?
- 14. адреса от размера геокодера всегда равны нулю
- 15. onActivityResult() Данные о намерениях всегда равны нулю
- 16. Почему обработчики событий COM всегда равны нулю?
- 17. Мои случайные числа всегда равны нулю?
- 18. Solr Результаты поиска всегда равны 0 .0
- 19. данные, хранящиеся в кеше, всегда равны нулю
- 20. ASP.Net mvc Параметры Url.Action всегда равны нулю.
- 21. Неинициализированные члены структуры всегда равны нулю?
- 22. iOS: почему поля всегда равны -20?
- 23. Градиенты тензорного потока всегда равны нулю
- 24. Утверждение, что массивы равны в тестовой среде Visual Studio 2008
- 25. Java: 1-мерные массивы всегда смежны в памяти?
- 26. Убедитесь, что произвольно сгенерированные массивы int [] не равны
- 27. Java Массивы BinarySearch
- 28. простые массивы умножения в java
- 29. Массивы равны нулю. Не получать информацию из цикла while
- 30. Java, два целых числа, они равны, но
Как насчет публикации фактического кода? –
Почему бы вам написать английское описание кода вместо того, чтобы просто публиковать сам код? –