用Java计算文件中的数字平均值?

时间:2016-11-17 04:01:53

标签: java eclipse java.util.scanner average

我正在开发一个程序,该程序应该从文件中读取数字,不仅可以打印它们,还可以查找和报告平均值。但是,我一直遇到如下错误:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextDouble(Unknown Source)
    at FileRead.GetAvg(FileRead.java:36)
    at FileRead.main(FileRead.java:18)

我是初学者,不确定到底出了什么问题。如果有人能够让我确切地知道我的错误是什么,或者如果我完全错误的话,就把我引向正确的方向,我们将不胜感激。我已经在这工作了好几天并且一直遇到错误。这是我的代码:

import java.util.*;
import java.io.*;
public class FileRead {

    public static void main(String[] args) throws FileNotFoundException {


        Scanner input = new Scanner(System.in);
        System.out.println("Input filename (Be sure to add .txt):");
        String filename = input.nextLine();
        File inputFile = new File(filename);
        Scanner reader = new Scanner(inputFile);
        ReadFile(reader);
        GetAvg(reader);
    }

    public static void ReadFile(Scanner reader) {           

        System.out.println("The numbers are: ");

        double count = reader.nextDouble();
        System.out.println(count);
        while (reader.hasNextDouble()){
            for (int i=0; i<count; i++);{
                System.out.println(reader.nextDouble());

            }
        }
    } 
    public static void GetAvg(Scanner reader) {           
        double count = 8;
        double numbers = reader.nextDouble();

        double sum = 0;

        for(int i=0; i <=count ; i++)
            sum = sum + numbers;

        double average = sum / count;

        System.out.println("Average is : " + average);



    }
}

3 个答案:

答案 0 :(得分:0)

  1. Map位于setsar=1开始之前的文件末尾,因为reader找到了它的结尾。
  2. GetAvg是在ReadFile中初始化的对象,通过引用传递给reader,以及传递给main。通过引用传递意味着在ReadFile完成后,GetAvg对其状态所做的任何更改都将在main和其他任何内容中成立。

    ReadFile调用ReadFile时,main使用了ReadFile(reader);。通过文件的方式,直到它找到它的结束。

    ReadFile

    当读者在要处理的文件中没有更多数据时,返回false,允许循环终止并使用 while (reader.hasNextDouble()){ 方法。

    完成readFile后,main将同一个读者对象传递到ReadFileGetAvg没有nextDouble来获取,因为它已在GetAvg期间到达文件的末尾

    1. for循环不是必需的,并且正在跳过数字。
    2. 让我们说文件中的第一个数字是4.7 然后for循环将拉出并打印接下来的四个数字。它不会打印4.7

      如果没有for循环,这行代码将打印4.7。然后循环将再次继续使用文件中找到的下一个双精度。

      ReadFile

答案 1 :(得分:0)

问题是你将同一个扫描程序传递给ReadFile()和GetAvg()。看看this。到达GetAvg()时,您已经耗尽了扫描程序,因此,double numbers = reader.nextDouble();会抛出错误,因为文件中的下一个双精度不存在。

快速修复可能是这样的:

File inputFile = new File(filename);
Scanner reader = new Scanner(inputFile);
ReadFile(reader);
Scanner reader = new Scanner(inputFile);
GetAvg(reader);  

答案 2 :(得分:0)

函数ReadFile中的一些缺陷:

  • double count = reader.nextDouble();这不会给你字符串/文字中浮点数的计数
  • 你得到NoSuchElementException,因为输入已经用尽,没有更多的。
  • 您可以使用hasNext(),如下所示(您已经在使用但我不认为循环对于您要实现的目标是必要的,而不是先使用确定计数。例如 - { {1}}
  • 您可以通过在while循环中添加一个计数器来确定计数,如果找到了double,则可以为自身添加1(Scanner sc = new Scanner(new File("myNumbers")); while (sc.hasNextLong()) { long aLong = sc.nextLong(); }