Java中的For-each循环

3
我有一段示例代码,创建了一个大小为10的“数组”,并尝试在For循环中使用逆序值进行初始化,例如:(9,8,7,6,5 ... 0):
int[] array = new int[10];
        for (int i = array.length - 1, j = 0; i >= 0; i--, j++) {
            System.out.println("Present value of i=" + i
                    + " Present value of j=" + j);
            array[j] = i;
            System.out.println("Array:" + j + "=" + i);
        }
        for (int k : array) {
            System.out.println(array[k]);
        }

到目前为止还不错。这是来自控制台的输出,完美无缺:

Present value of i=9 Present value of j=0
Array:0=9
Present value of i=8 Present value of j=1
Array:1=8
Present value of i=7 Present value of j=2
Array:2=7
Present value of i=6 Present value of j=3
Array:3=6
Present value of i=5 Present value of j=4
Array:4=5
Present value of i=4 Present value of j=5
Array:5=4
Present value of i=3 Present value of j=6
Array:6=3
Present value of i=2 Present value of j=7
Array:7=2
Present value of i=1 Present value of j=8
Array:8=1
Present value of i=0 Present value of j=9
Array:9=0

问题出在最后的 For-each 循环,它只是打印数组中的值:
for (int k : array) {
            System.out.println(array[k]);
        }

打印出来的数组值是0,1,2...9,但应该是9,8,7...0。
当我使用常规的For循环来打印数组时,它正常工作。我是否遗漏了一些有趣的事情?

1
for (int k : array) 是什么意思?array[k] 是什么意思? - Sotirios Delimanolis
3
提出一点建议;Java 不等于 Javascript。你现在所做的事情是 Javascript 的工作方式;一个高级的 for...in 循环会遍历对象的键。Java 的 for-each 循环只适用于值(values);它没有键的概念。 - Qix - MONICA WAS MISTREATED
3
一条经验法则是:标准的for循环在不同编程语言中基本相同。然而,各种编程语言中的"for-each"循环却大不相同。永远不要假定另一种语言中遍历循环的工作方式相同,甚至可能不存在! :) - Qix - MONICA WAS MISTREATED
@SotiriosDelimanolis 数组的值是在第一个 For 循环中分配的 - Anurag
我现在意识到,在我的匆忙中,输出不会改变你所打印的内容,因为你所打印的和你添加到数组中的是一对一的关系。 - Makoto
显示剩余2条评论
3个回答

11
你已经通过foreach循环从数组中获取了值,然后你又将其作为索引再次进入数组,以相同的顺序产生值。
只需打印k。更改。
for (int k : array) {
    System.out.println(array[k]);
}
for (int k : array) {
    System.out.println(k);
}

输出结束:

9
8
7
6
5
4
3
2
1
0

1
对于那些感到困惑的人来说,for(var key in array){var val = array[key]}是在JavaScript中迭代键的方法。而Java的foreach循环直接使用值来工作。我认为这就是造成混淆的原因。 - Qix - MONICA WAS MISTREATED

7

基本上,由于(int k : array)使k遍历数组中的,而不是索引,所以你所做的相当于

System.out.println(array[array[0]]);
System.out.println(array[array[1]]);
System.out.println(array[array[2]]);
System.out.println(array[array[3]]);
...
System.out.println(array[array[9]]);

这并不是你想要的。


0

这个for循环, for (int k : array) 基本上会详细地给你数组的值. 这个for循环是像这样的 -

int k = array[0] = 9 int k = array[1] = 8 .....

然后你再试着打印array [9],array [8],这会给你像0,1,2...的结果。将 for( int k : array){ System.out.println(array[k]); }

替换为 for(int k : array){ System.out.println(k); }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接