从文件计算平均值会产生意外输出

时间:2015-12-22 06:57:36

标签: java

我对java比较新,我想知道为什么这段代码没有给出欲望的结果。我必须阅读以下格式的文本文件:

Name Last Name, 92 82 88 96 78
name Last Name, 87 93 85 82 94

基本上是姓名+姓氏,然后是5分。我需要读取文件并打印到控制台,名称后跟每个人的平均得分。分数总是5,但没有指定人数。我的代码会抛出一个NoSuchElementException并给出错误的平均值结果。看看:

package nameavgfile;
import java.util.Scanner;
import java.io.*;


public class NameAvgFile {


    public static void main(String[] args) {
        Scanner inFile;
        final int count = 5;
        double score = 0;
        try{
            inFile = new Scanner(new File("data.txt"));
            while(inFile.hasNextLine()){
                String name = inFile.next()+" "+inFile.next();
                while(inFile.hasNextDouble()){
                    score += inFile.nextDouble();
                    System.out.println(name+" "+score/count);
                }
            }
        }catch(IOException e){
            System.out.println(e.getMessage());
        }
    }
}

2 个答案:

答案 0 :(得分:1)

问题1:

当您开始换行时,您并未将分数重置为零。

移动此行:

double score = 0;

到外(线)循环内的第一行。

问题2:

每次阅读乐谱时,您都会打印平均值。相反,在之后打印平均你已经阅读了所有分数,所以移动这一行:

System.out.println(name+" "+score/count);

在内部(得分)循环之外到外(循环)循环的最后一行。

问题3:

分数后你没有消费新的换行符。将此行添加到循环的末尾:

inFile.nextLine();

Java 8有一些东西可以让这个任务更容易。试试这个:

public static void main(String[] args) throws IOException {
    Files.lines(Paths.get("c:/tmp/data.txt")).forEach(NameAvgFile::processLine);
}

private static void processLine(String line) {
    String[] parts = line.split(" ");
    System.out.println(parts[0] + " " + parts[1] + " " + sum(Arrays.copyOfRange(parts, 2, parts.length)));
}

private static double sum(String[] doubleStrings) {
    return Arrays.stream(doubleStrings).mapToDouble(Double::parseDouble).average().getAsDouble();
}

答案 1 :(得分:-1)

尝试将System.out.println(name+" "+score/count);置于第一个循环中,如下所示:

   public static void main(String[] args) {
       Scanner inFile;
      final int count = 5;
       double score = 0;
       try{
           inFile = new Scanner(new File("C:\\temp\\file.txt"));
           while(inFile.hasNextLine()){
                String name = inFile.next()+" "+inFile.next();
                while(inFile.hasNextDouble()){
                     score += inFile.nextDouble(); 
                }
                System.out.println(name+" "+score/count);
            }
        }catch(IOException e){
            System.out.println(e.getMessage());
        }
    }