虽然Java中的循环不会对文档的最后一行执行操作

时间:2015-09-27 17:16:07

标签: java while-loop

我有一个文本文档,如下所示:

2 2 1 4 2 8
2 4 1 4 2 8
2 6 1 4 2 8

我想找到第二列(2,4,6)中所有数字的平均值。我写了一个我认为应该这样做的循环。 totalVal是加在一起的所有数字的总值,而totalNum是数字的总数。

String line = data.nextLine();// read one line into a String

while (data.hasNextLine()) {
    String[] field = line.split(" ");
    totalVal += Double.parseDouble(field[1]);
    totalNums += 1;
    line = data.nextLine();
}   
System.out.println(totalVal / totalNums);

问题是,我得到的答案返回值3,这意味着它只取文档中前两行文本的平均值,并省略第三行。

有人可以告诉我如何更改循环以便在第三行文本中添加值吗?

5 个答案:

答案 0 :(得分:7)

目前尚不清楚为什么在循环之前读取一行。

如果您读取一行作为循环的第一步,那么所有行都将被正确处理。

while (data.hasNextLine()) {
    String line = data.nextLine();
    String[] field = line.split(" ");
    totalVal += Double.parseDouble(field[1]);
    totalNums += 1;
}

答案 1 :(得分:6)

当您在最后一行之前时,使用line = data.nextLine();检索最后一行,然后立即检查data.hasNextLine()循环中是否while。由于您到达了最后一行,因此返回false并退出循环。

将您的代码更改为:

while (data.hasNextLine()) {
    String line = data.nextLine();
    String[] field = line.split(" ");
    totalVal += Double.parseDouble(field[1]);
    totalNums += 1;
}

首先检查是否有下一行然后获取它。

现在,超级Java 8单行为此:

double average = Files.lines(Paths.get(file))
                      .mapToDouble(l -> Double.parseDouble(l.split(" ")[1]))
                      .average().orElse(0);

答案 2 :(得分:2)

相信JVM:读完第三行后,没有下一行。它因为你告诉它而停止。

试试这样:

package cruft;

import java.util.Scanner;

/**
 * LoopDemo made to work
 * @author Michael
 * @link https://stackoverflow.com/questions/32810613/while-loop-in-java-wont-perform-action-on-last-line-of-document/32810646?noredirect=1#comment53458064_32810646
 * @since 9/27/2015 1:27 PM
 */
public class LoopDemo {

    public static void main(String[] args) {
        try {
            Scanner data = new Scanner(LoopDemo.class.getResourceAsStream("/LoopDemo.dat"));
            double totalVal = 0.0;
            int totalNums = 0;
            String line;
            while (data.hasNextLine()) {
                line = data.nextLine();
                String[] field = line.split("\\s+");
                totalVal += Double.parseDouble(field[1]);
                totalNums += 1;
            }
            System.out.println(totalVal / totalNums);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

答案 3 :(得分:2)

如果你在结尾打印出line,你会发现最后一行就在那里。您捕获了最后一行,清空了文件,然后检查了清空后是否还有其他文件。你应该这样做

while(data.hasNextLine())
{
    line = nextLine();
    // ...stuff...
}

并删除循环外的line = nextLine()或将其转换为do-while循环。

答案 4 :(得分:0)

您可以使用BufferedReader(br)读取文档的所有行,如下所示:

while ((line = br.readLine()) != null) { 
  doSomethingWith(line);
}