0

StringTokenizerで数行のテキストを個別のトークンに分割するのに問題があります。入力されたテキストは

3
monkeys

しかし、StringTokenizerはこれを「3monkeys」として解釈しているようです。「3」と「サル」である必要があります。このため、文字列「3」を整数に変換する必要があるため、NumberFormatExceptionがスローされます。

これは私がこれまでに持っているコードです。

    Scanner f = new Scanner( new FileInputStream("input.txt" )); // Yes, i have the actual input file path here, but I changed it for this question.
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("output.txt")));

    String temp = "";
    //String cString = "";

    while( f.hasNextLine() ) {
        String cString = f.nextLine();
        temp += cString;
    }
    StringTokenizer everythingTokens = new StringTokenizer( temp );
    String[] everything = new String[ everythingTokens.countTokens() ];

    for( int i = 0; i < everything.length; i++ ) {
        everything[ i ] = everythingTokens.nextToken();
    }

    int numberOfPeople = Integer.parseInt( everything[ 0 ] ); // Line where exception occurs.
    out.println( everything[ 0 ] );

エラーメッセージはこれです

Exception in thread "main" java.lang.NumberFormatException: For input string: "3monkeys"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at gift1.main(gift1.java:32)
Java Result: 1

なぜこれが起こっているのですか、どうすれば修正できますか?

4

3 に答える 3

1

StringTokenizerが新しい行でトークンを作成しない

結果のに改行文字はありませんString。それを変えるには..

String eol = System.getProperty("line.separator");
...
  temp += cString + eol;

最終的には、そのコードを破棄してやり直します。

  1. StringBuilderではなく使用String +=
  2. しかしString、整数であることが予想される場合、なぜ最初の行をaに追加するのでしょうか。すぐに解析し、その後String、1行目で読み取ったものを無視します。
于 2012-07-23T01:03:58.047 に答える
0

を介して各行を文字列に追加しているのでtemp += cString、「3」+「monkeys」(「3monkeys」)があります。各行の後にスペースを追加することで、これを解決できます。temp += cString + " "

于 2012-07-23T00:57:33.700 に答える
0

何が起こるかあなたはこれらと3匹とサルを連結します

while( f.hasNextLine() ) {
    String cString = f.nextLine();
    temp += cString;
}

したがって、tempには、改行文字を削除する3つのモンキーが含まれます。

各行が個別のトークンになるように入力ファイルをフォーマットする場合は、まだトークナイザーは必要ないと思います。配列にcStringを追加するか、ArrayListを使用するだけで、気にする必要はありません。配列のサイズ

于 2012-07-23T00:58:32.117 に答える