我有这段代码:
System.setIn(new FileInputStream( System.getProperty("user.dir") + "/src/one.in"));
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (i = 0; i < ...; i++) {
String line = reader.readLine();
String firstLocation = line.substring(0, line.indexOf(' '));
String mid = line.substring(line.indexOf(' '), line.lastIndexOf(' ')).trim();
String secondLocation = line.substring(line.lastIndexOf(' ') + 1);
....
}
我阅读了许多形式的行:
A --875-> B
A <-854-- B
A --713-> B
A <-908-- B
A --925-> B
A <-894-- B
A --239-> B
A <-30-- B
A --802-> B
是否有最快的方式来阅读和处理这一行?我也尝试在一个行中读取所有行,并使用行尾字符分割,但它的工作速度更慢。
答案 0 :(得分:1)
我知道最快的方法是使用StringTokenizer。然后你的代码看起来像这样:
System.setIn(new FileInputStream(System.getProperty("user.dir") "/src/one.in"));
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (reader.ready()) {
final StringTokenizer tk = new StringTokenizer(reader.readLine()," ");
String first = tk.nextToken();
String second = tk.nextToken();
String third = tk.nextToken();
...
}
我不会在这里检查是否有足够的令牌可用,因为你知道你输入String的结构,这也节省了时间。正如您所看到here,StringTokenizer比使用Pattern
或split(...)
方法更快。
答案 1 :(得分:0)
String[] parts = line.split(" ");
String firstLocation = parts[0];
String mid = parts[1];
String secondLocation = parts[2];
答案 2 :(得分:0)
最好是设计方法并将其保存为库(甚至作为IDE中的模板!) 例如,如果要从System.in读取整数,可以使用此函数
static int readInt(BufferedInputStream b) throws IOException {
String s = "";
int x = b.read();
while (x < 48 || x > 57) {
x = b.read();
}
while (x >= 48 && x <= 57) {
s = s + (char) x;
x = b.read();
}
return Integer.parseInt(s);
}
此方法将获取输入中的下一个可用Integer。 此方法忽略任何非数字字符。
例如,如果您的输入如下:
" 123 !!!@@b"
输出将完全
123
重要的是,这个方法在Scanner中扮演nextInt()的角色,但速度比前者快。