有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

我想找到第二列(2,4,6)中所有数字的平均值。我写了一个while循环,我认为应该这样做。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) 个答案

  1. # 1 楼答案

    不清楚你为什么在循环前读一行

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

    while (data.hasNextLine()) {
        String line = data.nextLine();
        String[] field = line.split(" ");
        totalVal += Double.parseDouble(field[1]);
        totalNums += 1;
    }
    
  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. # 3 楼答案

    当您位于前最后一行时,使用line = data.nextLine();检索最后一行,然后立即检查while循环中的data.hasNextLine()。由于到达了最后一行,因此返回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);
    
  4. # 4 楼答案

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

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

    然后移除循环外的line = nextLine(),或者将其转换为do while循环

  5. # 5 楼答案

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

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