使用foreach循环更改2D数组中的值

时间:2015-05-21 04:38:39

标签: java multidimensional-array foreach

我在Java中遇到了一个有趣的夸克。

此代码段将按预期执行(将数组内的所有值更改为0):

int[][] test = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test) {
    current[0] = 0;
    current[1] = 0;
    current[2] = 0;
}

然而,这不会:

int[][] test = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test) {
    for (int num : current) {
        num = 0;
    }
}

感谢任何帮助。提前谢谢。

修改

为了澄清,我理解为什么第二个代码段不起作用。我想知道为什么第一部分有效。谢谢。我不是在寻找“这会起作用”的回应,我想知道第一段与第二段的区别。

4 个答案:

答案 0 :(得分:2)

您只对local变量进行了更改。它不会影响您正在遍历的阵列。

for-each循环只是一个合成糖,用于循环iterator

答案 1 :(得分:2)

for(Iterator<Integer> num = current.iterator(); num.hasNext(); ) {
    num = 0;
}

这是foreach扩展时会发生的事情。您需要了解的是,在您的第一个片段中,Iterator迭代一个名为&#34; current&#34;的一维数组,它通过引用传递。因此,当前的任何变化都会反映在&#34; temp&#34;上。但是,int是按值传递的,这就是为什么在你的第二个片段中,&#34; num&#34;没有反映在&#34;当前&#34;。因此,您只需更改与原始数组无关的其他变量的值。尝试打印以下内容以便更好地理解。

    int[][] test1 = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
    for (int[] current : test1) {
        for (int num : current) {
            System.out.println(num);
            num = 0;
        }
    }

答案 2 :(得分:1)

有一个库方法Arrays.fill可以为一维数组设置相同的值。使用它,这样你的代码就会干净而快速。

int[][] test = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test)
    Arrays.fill(current, 0);

答案 3 :(得分:0)

这将有效:

int[][] test = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test)
    for (int i = 0; i < current.length; i++)
        current[i] = 0;