我对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());
}
}
}
答案 0 :(得分:1)
当您开始换行时,您并未将分数重置为零。
移动此行:
double score = 0;
到外(线)循环内的第一行。
每次阅读乐谱时,您都会打印平均值。相反,在之后打印平均你已经阅读了所有分数,所以移动这一行:
System.out.println(name+" "+score/count);
在内部(得分)循环之外到外(循环)循环的最后一行。
分数后你没有消费新的换行符。将此行添加到循环的末尾:
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());
}
}