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 に答える