1
Scanner s = null;
    try {
        s = new Scanner(new BufferedReader(new FileReader("rates.txt")));
            for (int i=0; i<9; i++){
                while(s.hasNext()){rates[i] = s.next();}
                System.out.println(rates[i]);
            }
    }catch (IOException e){
        System.out.println(e);
    }
    finally {
        if (s != null) {
            s.close();
        }
    }

このコードを実行すると、txt ファイルの最後の文字のチャンクが読み取られ、rates[0] に配置され、1 ~ 9 で null が固定されます。ファイルの最後を最初に読み取る理由がわかりません。txt の内容は以下のとおりです。

USD 1.34

EUR 1.00

JPY 126.28

GBP 0.88

INR 60.20

配列に記録しているのは 60.20 だけです。どんな助けでも大歓迎です。このコードを実行した結果を提供できると思います。

run:
60.20
null
null
null
null
null
null
null
null
BUILD SUCCESSFUL (total time: 0 seconds)
4

4 に答える 4

3
while(s.hasNext()){rates[i] = s.next();}

平易な英語では、これは次のように言います: トークンが残っている間、次のトークンを に入れますrates[i]

したがって、最初のトークンを に入れrates[i]、次に次のトークンを に入れrates[i]、次のトークンを に入れrates[i]、...、最後に最後のトークンを に入れrates[i]ます。は変更されていないためi、すべての値が配列の同じ要素に書き込まれ、以前に読み取られた値が上書きされます。

于 2010-04-10T13:21:29.257 に答える
1

私はお勧め:

  • List配列の代わりに 使用
    • より柔軟で、操作がはるかに簡単で、Java Collections Framework などを利用できます。
  • 通貨記号と数値為替レートをすべて 1 つの混合バッグに格納しない
    • ...しかし、クラスを使用してペアをカプセル化します
  • 数値為替レートを読み取るために使用します(おそらく、とにかくScanner.nextDouble()変換​​したいでしょう)double

したがって、次のようなものです。

List<ExchangeRate> allRates = new ArrayList<ExchangeRate>();
while (sc.hasNext()) {
    String symbol = sc.next();
    double rate = sc.nextDouble();
    allRates.add(new ExchangeRate(symbol, rate));
}

方法に注意してください:

  • 配列に割り当てる要素の数を知る必要がなくなりました
  • シンボルとレートがすべて 1 つの混合バッグに入れられるわけではありません
  • List.add追跡および管理する必要があるカウンターがないことを意味します
    • つまり、元の質問のバグです!
于 2010-04-10T15:37:17.850 に答える
0

もう1つの潜在的な問題:FileReaderプラットフォームのデフォルトエンコーディングを使用します。これはユーザー提供のファイルを処理するのに適していますが、ファイルがアプリケーションの一部である場合、互換性のないデフォルトのエンコーディングを使用するシステムでアプリケーションを実行すると、ファイルが破損する可能性があります(ASCII文字のみを使用しても保護されませこれに対して完全に)。

この問題を回避するには、代わりにnewを使用します。そして、実際にファイル用InputStreamReader(new FileInputStream(filename), encoding)にを選択する必要があることを認識してください。encoding

于 2010-04-10T15:47:12.960 に答える
0

問題は、while ループを含む 5 行目でファイル入力全体を読み取ることだと思います。forしたがって、i = 0の最初のループ反復でファイル全体を読み取ります。次回のforループでは、読み取るものが残っていません。

代わりに、おそらく次のようなものが必要です。

List rates = new ArrayList();
while (s.hasNext()) {
      rates.add(s.next());
}
于 2010-04-10T13:26:43.903 に答える