Groovy中的不同循环行为

时间:2013-08-12 18:57:51

标签: java loops groovy

为什么这两个循环有不同的结果?我认为他们都会将每个数组中的所有值初始化为5,但只有第二个值可以工作。有人可以解释为什么会这样吗?

static main(args)
{
    double[][] x = new double[3][3]
    double[][] y = new double[3][3]

    for(row in x)
    {
        for(num in row)
        {
            num=5
        }
    }

    for(int i=0;i<y.size();i++)
    {
        for(int j=0;j<y[i].size();j++)
        {
            y[i][j]=5
        }
    }

    println "x: ${x}" 
    println "y: ${y}"
}

这是输出

x: [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
y: [[5.0, 5.0, 5.0], [5.0, 5.0, 5.0], [5.0, 5.0, 5.0]]

2 个答案:

答案 0 :(得分:2)

在第一个循环中,您正在更改一个永远不会更新数组中的内容的局部变量。 num保存数组元素中的数据副本,但是没有对数组条目的引用,因此更改它对数组没有影响。

这种方式比旧式for循环更有趣:

for (i in 0..x.length - 1) {
    for (j in 0..y.length - 1) {
        x[i][j] = 5
    }
}

或者您可以不使用for

(i in 0 .. x.length - 1).each { i ->
    (j in 0 .. y.length - 1).each { j ->
        x[i][j] = 5
    }
}

答案 1 :(得分:1)

第一对for循环什么都不做,这是正确的。 num是内部for范围内的新变量。它是对表中整数的引用。分配时,它将成为对值5的引用。表格单元格不会更改。

对于C程序员。

int five = 5;
int *num;

是:

num = &five;

不是:

*num = five;