【问题标题】:Calculate total and average from a file计算文件的总数和平均值
【发布时间】:2018-09-26 20:33:43
【问题描述】:

我正在尝试从 scores.csv 计算总数和平均数,但由于某些原因它无法计算。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class TotalAndAverage {

    public static void main(String[] args) {
        try {
            Scanner fin = new Scanner(new File("Scores.csv"));
            double total = 0, count = 0;
            while (fin.hasNextInt()) {
                total += fin.nextInt();
                count++;
            }
            System.out.println("Total score is " + total);
            System.out.println("Average score is " + (total/count));
            fin.close();
        } catch (FileNotFoundException e) {
            System.out.println("Scores.csv does not exists!");
        }
    }

}

当我运行它时显示, Total score is 0.0 Average score is NaN 你知道为什么吗?我检查了我的文件,里面有数据。

【问题讨论】:

  • 我检查了我的文件,里面有数据。 - 这些数据是什么样的?
  • 因为你什么都没读,如果总和当前都是0,那么它只是0/0,它是未定义的和NAN(不是数字)
  • “Scores.csv”字符串在文件中?请注意,fin.hasNextInt() 如果发现无法理解为整数的内容(如“Scores.csv”),则返回 false。这会从一开始就破坏您的while 循环。
  • 除了@rslemos 所说的,扫描仪似乎没有找到integers
  • @Sami 鉴于您的问题可能与数据有关(代码看起来不错,虽然我个人从未使用过java.util.Scanner),我只能建议您使用调试器来找出您的问题真的来自Scanner

标签: java file csv io try-catch


【解决方案1】:

正如 cmets 中的其他人所解释的,Scanner 类的 hasNextInt 方法通过将输入流分解为标记来工作,并在遇到非整数标记时立即返回 false。由于某种原因,其中可能存在非数字数据,因此它正在接收并返回 false。

处理这些数据的更合适的方法是使用hasNext() 来控制while 循环的终止,允许您循环遍历文件的每个标记,跳过非整数标记,然后在所有标记完成后终止被消费,而不仅仅是在找到第一个非整数令牌时:

while(fin.hasNext()) {
  if(fin.hasNextInt()) {
    int integer = fin.nextInt();
    total += integer;
    count++;
  }else{
    fin.next();
  }
}

【讨论】:

  • 根据@sami 评论 Scores.csv 中的所有数据都是整数
  • 是的,Scores.csv 中的所有数据都是整数。不过谢谢!
  • 啊当@ScaryWombat我没有看到那个消息。我已将答案修改为更通用,以防其他人遇到该问题。这是一个奇怪的。我不能用任何奇怪的空格字符欺骗它给我同样的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 2018-10-09
  • 1970-01-01
相关资源
最近更新 更多