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 中时,它没有运行。它在“BufferedReader f = new BufferedReader ...”行给出了 FileNotFoundException,我想这是因为“test.out”,但我不知道该放什么。我该如何解决?

此外,USACO 表示这是解析输入文本的最有效方式。这是真的?例如,这真的是检索输入文本的最有效方法吗?我熟悉 Scanner 类等其他方法,但 USACO 坚持认为使用 BufferedReader、PrintWriter 等是最好的方法。

4

2 回答 2

2

StringTokenizerScanner和更有效split。两者都Scanner使用split正则表达式来标记他们的输入。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 回答