【问题标题】:Using the Random() class with enhanced for loops使用带有增强 for 循环的 Random() 类
【发布时间】:2018-01-07 14:13:14
【问题描述】:

增强的 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() 时,它只是第一个被改变的元素?

【问题讨论】:

  • 增强的 for 循环没有索引。你可以查看它相当于某种Iterator&lt;X&gt; iter = iterable.iterator(); while (iter.hasNext()) { X element = iter.next(); }。这也是它支持Iterable 类型的所有内容的原因。有些可迭代元素在每个定义中都没有索引。

标签: java arrays for-loop foreach


【解决方案1】:

增强的 for 循环:

for (int score : scores)

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

当你用int[] scores = new int[size] 实例化数组时,默认情况下所有值都初始化为0

因此:

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

总是:

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

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

【讨论】:

  • 感谢您的澄清和解释!我想我现在会这样考虑差异:对于传统的 for (x;y;z) 循环,我将照常阅读“对于 i 中的索引,执行此操作”,而使用增强的 for( x:y) 循环,读起来更像是“对于数组中的实际值,执行此操作”。再加上其他的解释,它确实帮助我全面了解了情况。我无法决定肯定“打勾”的答案,所以当你的答案排在第一位时,我认为答案排在第一位。
【解决方案2】:

这些是不同的结构。本质上,在第一个循环中,您是在说“获取scores 的所有元素并循环遍历它们. You don't get the index, you get the actual values which will always be0` 在您的情况下!

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

如您所见,您的第二个循环会为您提供索引 (i),而不是 scores 数组中的值。

【讨论】:

  • 感谢您的澄清和解释!再加上其他的解释,它确实有助于给我一个整体的画面。我无法决定肯定“打勾”的答案,所以我打勾了队列中最先出现的答案,因为我认为答案最先出现。
  • 很高兴你发现它有用。
【解决方案3】:

您似乎对 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);

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

【讨论】:

  • 感谢您的澄清、解释和示例!与其他人一起,它确实帮助我了解了整体情况。你的例子特别有启发性。我无法决定肯定“打勾”的答案,所以我打勾了队列中最先出现的答案,因为我认为答案最先出现。
【解决方案4】:

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

 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 进行初始化,因此在每次迭代中,它都会更新0th 索引处的值。

【讨论】:

  • 感谢您的澄清和解释!再加上其他的解释,它确实帮助我全面了解了情况。我无法决定肯定“打勾”的答案,所以我打勾了队列中最先出现的答案,因为我认为答案最先出现。
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多