3

我有一个包含学生成绩的文本文件,例如:

Kim $ 40 $ 45
Jack $ 35 $ 40

我正在尝试从文本文件中读取这些数据,并使用 Scanner Class 将信息存储到数组列表中。任何人都可以指导我正确编写代码吗?

代码

import java.io.*;
import java.util.*;

public class ReadStudentsGrade {

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

    ArrayList stuRec = new ArrayList();
    File file = new File("c:\\StudentGrade.txt");
    try {
        Scanner scanner = new Scanner(file).useDelimiter("$");

        while (scanner.hasNextLine())
        {
            String stuName = scanner.nextLine();
            int midTirmGrade = scanner.nextInt();
            int finalGrade = scanner.nextInt();
            System.out.println(stuName + " " + midTirmGrade + " " + finalGrade);
        }
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
}

运行时错误:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:840)
    at java.util.Scanner.next(Scanner.java:1461)
    at java.util.Scanner.nextInt(Scanner.java:2091)
    at java.util.Scanner.nextInt(Scanner.java:2050)
    at writereadstudentsgrade.ReadStudentsGrade.main(ReadStudentsGrade.java:26)
4

2 回答 2

2

尝试useDelimiter(" \\$ |[\\r\\n]+");

        String stuName = scanner.next(); // not nextLine()!
        int midTirmGrade = scanner.nextInt();
        int finalGrade = scanner.nextInt();

你的问题是:

  • 您错误地阅读了整行以获取学生姓名
  • $是一个需要转义的正则表达式元字符
  • 您需要同时提供行分隔符和字段分隔符
于 2010-03-13T21:35:07.220 回答
0

您的while循环已关闭。

nextLine()将为您提供该行的所有剩余内容并将光标移到那里。 nextInt()然后将跳转分隔符,直到找到一个 int。结果将是跳过值。
假设 Kim 和 Jack 在不同的线路上,你会得到:

stuName == "Kim $ 40 $ 45"
midTirmGrade == 35
finalGrade == 40

作为你的输出;这不是你想要的。

您需要使用行尾作为分隔符,或者使用StringTokenizer将每行拆分,然后将每个部分解析为单独的标记。

于 2010-03-13T21:45:24.990 回答