Java, модифицирующий элементы в foreach

Я изучаю Java самостоятельно; и, следовательно, код ниже не имеет никакой функции, кроме как для обучения / тестирования.

По сути, я пытаюсь модифицировать элементы массива Integer (а именно, делить их пополам) в цикле foreach.

Я должен отметить, что я не переупорядочиваю, не добавляю и не удаляю элементы; просто меняя свои ценности.

Вот мой код:

Logger.describe("Now copying half of that array in to a new array, and halving each element");
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE / 2];     
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE / 2);
for (Integer x : copyArray) x /= 2;
Logger.output(Arrays.deepToString(copyArray));

Однако оригинальный массив (intArray) выглядит так:

[47, 31, 71, 76, 78, 94, 66, 47, 73, 21]

И вывод copyArray:

[47, 31, 71, 76, 78]

Таким образом, хотя размер массива уменьшился вдвое, значение элементов (целых чисел) также не уменьшилось вдвое. Так что я делаю не так?

Спасибо

 maksimov14 июн. 2012 г., 13:40
Я думаю, что это связано с автобоксом, поэтому, когда вы делаетеx/2он не изменяет значение объекта, но автоматически преобразует его в примитивint и делит его, поэтому вашInteger экземпляр не затронут.
 maksimov14 июн. 2012 г., 13:48
по существуx = x/2 этоx = new Integer(x.intValue()/2), Таким образом, поскольку вы не добавляете его обратно в массив, вы не модифицируете свои элементы массива.
 Xenoprimate14 июн. 2012 г., 13:43
Таким образом, оператор / = применим только к & int; типы значений, а не целые числа, ведущие 'x' apos; переменная для преобразования в int?

Ответы на вопрос(4)

Решение Вопроса

for (int i=0; i<copyArray.length;i++)
    copyArray[i] /= 2;

Иначе вы не назначаете его обратно в массив.Integer Кстати, объекты являются неизменяемыми, поэтому не могут их изменять (хотя и создают новые).

Обновлено из комментария: Остерегайтесь, однако, что происходит несколько вещей, например, автобокс / распаковка:

copyArray[i] = Integer.valueOf(copyArray[i].intValue()/2);
 14 июн. 2012 г., 14:04
Да, в java это объектная оболочка, и для них делается автоматическая распаковка.
 Xenoprimate14 июн. 2012 г., 13:44
Учитывая их неизменность, это просто означает, что он заменит объект Integer новым в массиве?
 25 февр. 2014 г., 08:16
неизменным является ключевым моментом, ткс!
 14 июн. 2012 г., 13:52
Правильный. В этом случае также происходит автобокс / распаковка. Так что симлиар тожеcopyArray[i] = Integer.valueOf(copyArray[i].intValue()/2);
 Xenoprimate14 июн. 2012 г., 13:53
Так Integer - просто обёртка объекта для int? Не фактический псевдоним (как в C #)?
int counter = 0;
for(int x : copyArray)
{
        x /= 2;
        copyArray[counter++] = x;
}

x а не значения внутри блоков массиваcopyArray

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

Logger.describe("Now copying half of that array in to a new array, and halving each element");
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE / 2];     
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE / 2);
    for (int i = 0; i < copyArray.length; i++) {
        copyArray[i] /= 2;
    }
Logger.output(Arrays.deepToString(copyArray));
 14 июн. 2012 г., 14:11
Как правило, вы МОЖЕТЕ изменить элементы (если они изменяемы), реальная проблема заключается в том, что целые числа неизменны ...
for (int i = 0; i< copyArray.length; i++) {
    copyArray[i] = new Integer(x /2);
}

Ваш ответ на вопрос