5

我正在自学Java;因此下面的代码除了用于学习/测试之外没有其他功能。

本质上,我正在尝试在 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]

因此,尽管数组的大小减半,但元素(整数)的值并没有减半。那么我做错了什么?

谢谢

4

4 回答 4

13

你不能在 foreach 循环中做到这一点。

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

否则,您不会将其分配回数组中。Integer顺便说一下,对象是不可变的,因此无法修改它们(尽管创建新对象)。

从评论更新:请注意,尽管发生了一些事情,例如自动装箱/拆箱,大致如下:

copyArray[i] = Integer.valueOf(copyArray[i].intValue()/2);
于 2012-06-14T11:41:09.677 回答
1
for (int i = 0; i< copyArray.length; i++) {
    copyArray[i] = new Integer(x /2);
}

应该管用。

于 2012-06-14T11:39:24.437 回答
1
int counter = 0;
for(int x : copyArray)
{
        x /= 2;
        copyArray[counter++] = x;
}

您的程序只是修改了变量的值x,而不是数组块中的值copyArray

于 2012-06-14T11:45:29.523 回答
0

我认为您不能使用 foreach 循环构造来修改您正在迭代的数组的元素。相反,您需要像这样使用经典的 for 循环:

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));
于 2012-06-14T11:47:22.217 回答