1

私は今年後半にUSACOに参加する予定であり、おそらくJavaを使用する予定です。ただし、ファイルI/Oについては十分に説明していません。USACOは、入力されたテキストを解析するために、このBufferReader、PrintWriter、およびStringTokenizerの組み合わせを使用することを要求しています。彼らが示したコードは次のとおりです。

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

class test {
  public static void main (String [] args) throws IOException {
    // Use BufferedReader rather than RandomAccessFile; it's much faster
    BufferedReader f = new BufferedReader(new FileReader("test.in"));
                                              // input file name goes above
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("test.out")));
    // Use StringTokenizer vs. readLine/split -- lots faster
    StringTokenizer st = new StringTokenizer(f.readLine());
                      // Get line, break into tokens
    int i1 = Integer.parseInt(st.nextToken());    // first integer
    int i2 = Integer.parseInt(st.nextToken());    // second integer
    out.println(i1+i2);                           // output result
    out.close();                                  // close the output file
    System.exit(0);                               // don't omit this!
  }
}

ただし、コードを文字通りNetbeansにコピーして貼り付けたところ、実行されませんでした。「BufferedReaderf=new BufferedReader ...」の行にFileNotFoundExceptionが発生しました。これは「test.out」が原因だと思いますが、何を入力すればよいかわかりません。これを修正するにはどうすればよいですか?

さらに、USACOは、これが入力されたテキストを解析するための最も効率的な方法であると述べました。これは本当ですか?のように、これは入力されたテキストを取得するための本当に最も効率的な方法です。私はScannerクラスのような他の方法に精通していますが、USACOは、BufferedReader、PrintWriterなどを使用することがそれを行うための最良の方法であると主張しています。

4

2 に答える 2

2

StringTokenizerScannerおよびよりも効率的ですsplit。両方ともScannersplit正規表現を使用して入力をトークン化します。StringTokenizer正規表現を使用しないため、使用によるオーバーヘッドが発生しません。

test.inプロジェクトの作業ディレクトリにあるファイルです。

YourProject
    src
        test.java
    bin 
        test.class
    test.in
于 2012-07-22T02:22:37.083 に答える
1

私は当時、純粋なJavaを使用してUSACOを実行しました。(私は本当にうまくいきました。)

ほとんどScannerの場合、使用したいと考えています。これはプログラミングコンテストに最適であり、通常、I/Oがボトルネックになることはありません。 StringTokenizerはもう少し効率的ですが、とにかくプログラムが線形時間になる場合にのみ、それについて本当に心配する必要があります。

于 2012-07-22T10:52:57.930 に答える