0

テキストファイルから読み取るコードは次のとおりです。

    public RecordManager(){
    int pos;
    String athlete, record, country, raceTime;
    try {
        Scanner scFile = new Scanner(new File("resultdata.txt"));
        while(scFile.hasNext()){
            Scanner sc = new Scanner(scFile.next()).useDelimiter("#");
            athlete = sc.next();
            country = sc.next();
            pos = sc.nextInt();
            record = sc.next();
            raceTime = sc.next();                
            sc.close();
            if("WRC".equals(record)){
                resultArr[size] = new WorldRecord(athlete, country, pos, raceTime);
            }
            else if("OLR".equals(record)){
                resultArr[size] = new OlympicRecord(athlete, country, pos, raceTime);
            }
            else{
                resultArr[size] = new RaceResult(athlete, country, pos, raceTime);
            }
            size++;
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger(RecordManager.class.getName()).log(Level.SEVERE, null, ex);
    }

テキストファイルの内容は次のとおりです。

Carey Blem#ITA#6#---#4m49.8 
Tammera Hoesly#POR#1#---#4m6.2 
Toi Swauger#FRA#1#OLR#51.3 
Moises Mellenthin#ZIM#2#---#4m34 
Madelene Mcclennon#LUX#1#WRC#1m52.7 
Lashon Meisenheimer#RSA#1#---#2m31.2

私は試行錯誤してきましたが、私はこれを取得し続けています:

run:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1416)
at it.practical.training.RecordManager.<init>(RecordManager.java:29)
at it.practical.training.SimpleInterface.main(SimpleInterface.java:20)
Java Result: 1
BUILD SUCCESSFUL (total time: 13 seconds)

何が悪いのか教えてください。

4

2 に答える 2

5

使用next()すると、次の単語が読み上げられます。最初の行には と の 2 つの単語がCareyありBlem#ITA#6#---#4m49.8ます。行から単語を読み終わったらnextLine()、次の行に移動するために を使用する必要があります。

あなたが本当に望んでいるのは

Scanner sc = new Scanner(scFile.nextLine()).useDelimiter("#");

一度に 1 行全体を読み取ること。

于 2012-08-28T15:48:54.273 に答える
0

何が問題なのか完全にはわかりませんが、スキャナーを使用してファイルを読み取ることはまったくありません。私はBufferedReaderを使用し、readline メソッドが null を返さない間はループします。次に、String クラスの split メソッドを使用して、必要な情報を取得します。例えば

public RecordManager(){
  int pos;
  String line;
  String[] info;
  try {
    BufferedReader scFile = new BufferedReader(new FileReader(new File("resultdata.txt")));
    line = scFile.readLine();
    while(line != null){
        info = line.split("#");//now athlete is in index 0, country at index 1 etc              
        if("WRC".equals(info[3])){
            resultArr[size] = new WorldRecord(info[0], info[1], info[2], info[4]);
        }
        else if("OLR".equals(info[3])){
            resultArr[size] = new OlympicRecord(info[0], info[1], info[2], info[4]);
        }
        else{
            resultArr[size] = new RaceResult(info[0], info[1], info[2], info[4]);
        }
        size++;
        line = scFile.readLine();
     }
  } catch (FileNotFoundException ex) {
    Logger.getLogger(RecordManager.class.getName()).log(Level.SEVERE, null, ex);
  }
}

あなたのコードに何が起こっているのかを直接答えることはできませんが、必要なことを行う別の方法を提供します。いずれにせよ役立つことを願っています。

于 2012-08-28T16:13:59.280 に答える