使用带有增强for循环的Random()类

时间:2018-01-07 14:13:14

标签: java arrays for-loop foreach

增强的for循环很奇怪。为什么

int size = 10;
Random random = new Random();
int[] scores = new int[size];

for (int score : scores) {
    scores[score] = random.nextInt(size);
}
System.out.println(Arrays.toString(scores));

给我一​​个大部分为空的数组,其中只有第一个元素是随机数, 同时:

int size = 10;
Random random = new Random();
int[] scores = new int[size];

for (int i = 0; i < scores.length; i++){
    scores[i] = random.nextInt(size);
}
System.out.println(Arrays.toString(scores));

给了我想要的东西:一个由随机数字组成的10元素数组? 我以为这两个循环是彼此的替换;但是当谈到Random()时,它只是第一个被改变的元素?

4 个答案:

答案 0 :(得分:4)

增强的for循环:

for (int score : scores)

迭代数组的值,而不是索引。

使用int[] scores = new int[size]实例化数组时,默认情况下,这些值都会初始化为0

因此:

scores[score] = random.nextInt(size);

总是:

scores[0] = random.nextInt(size);

当你需要修改一个数组时,你应该使用传统的for循环,它遍历索引。

答案 1 :(得分:3)

这些是不同的结构。基本上在第一个循环中,你说&#34;去获取scores的所有元素并在你的情况下循环它们. You don't get the index, you get the actual values which will always be 0`!

for (int score : scores){
    // score is always 0!
    scores[score] = random.nextInt(size);
} 

您的第二个循环,正如您已经想到的那样,为您提供索引(i)而不是scores数组中的值。

答案 2 :(得分:2)

实际上你有两个不同的循环,

 for (int score : scores){

for (int i = 0; i < scores.length; i++){

第一个给出value数组(不是指定数组的索引),而第二个给出index。如上所述,下面代码的含义会发生变化

scores[score] = random.nextInt(size);

因此,假设您的数组具有值1,2,5,因此您基本上会在第一个循环中访问索引125,另一方面,第二个循环将值分配给特定索引,该索引与012一致。

由于使用默认值scores初始化0,因此在每次迭代中,它都在0索引处更新值。

答案 3 :(得分:2)

似乎你对Java中的增强循环有一个误解,因为它是一个foreach循环并迭代数组的值,而不是遍历键:

请看以下示例

String[] my_string_array = new String[]{"Dog","House","Cat"};
for(String s: my_string_array){
    System.out.println(s); //prints "Dog", then "House", then "cat" 
    //s equals one entry of the Array
}

在您的示例中,数组的每个条目都是0,因为这是整数的默认值。 因此,在每次重复数组时,都会发生以下情况

scores[0] = random.nextInt(size);

我希望您了解第一个代码的问题。 只需使用第一个,它是工作和最佳实践。