新的for循环提供与旧结果不同的结果

时间:2019-11-12 02:10:02

标签: java

基本上,我有这个for循环,该循环应该遍历arraylist中的所有元素,并将它们添加到名为average的变量中。

for(int i : numbers) {average += numbers.get(i - 1); }  

但是当我运行它时,它返回的值比此for循环大

for(int i = 0; i < numbers.size(); i++)
      average += numbers.get(i)

真正有趣的是,似乎只使用从下面链接的文件中读取的这组数字来执行此操作,否则似乎返回了另一个循环的相同值。但是需要注意的是,在两次试验中,将文件读取和存储到arraylist中的操作仍然相同。任何帮助表示赞赏。

https://pastebin.com/m1Dx30qR

4 个答案:

答案 0 :(得分:2)

在您的第二个for循环中,i是列表中的索引,因此可以使用numbers.get方法来查找列表中该索引处的值。

在第一个for循环中,i是列表中的,而不是索引;所以等效的行为是直接将其添加:

for(int i : numbers) {
    average += i;
}

我建议为索引变量保留名称i以避免混淆;对于这种循环,请使用其他名称,在该循环中您可以遍历值而不是索引。

答案 1 :(得分:0)

您的代码应该是这样的。您正在尝试添加到索引中。

for(int i: numbers) {
    sum += i; 
}

average = (double) sum/l.size();

答案 2 :(得分:0)

在增强的for循环中,我们不应基于索引获取值。只需从变量获取值即可。

错误

Example

正确的方式

for(int i : numbers) {average += numbers.get(i - 1); }

答案 3 :(得分:0)

您的第一个for循环int i从数组numbers获取每个值,您无法控制索引,并且从0开始递增直到最大数组大小

示例:您的numbers包含[8,2,4]

通过写作:

for (int value : numbers) {
    average += value; // 1. average = 8
                      // 2. average = 10
                      // 3. average = 14
}

除非您真的想使用这种现代的for循环获取索引,否则必须显式指定它,但这是没有意义的工作。

int i = 0;
for (int value : numbers) {
    average += numbers.get(i);
    // do lots of other calculation using index i
    i++;
}