我正在研究 UVa Online Judge 问题集存档,作为练习 Java 的一种方式,以及作为一种练习数据结构和算法的方式。
他们提供了一个示例输入文件,以提交给在线评委作为起点(这是问题 100 的解决方案)。
来自标准输入流(java.lang.System.in)的输入是本网站上任何解决方案的一部分,但我无法理解他们在示例解决方案中给出的从 System.in 读取的实现。输入文件确实可以包含整数、字符串等的任何变体,但是每个解决方案程序都需要从 System.in 读取文本输入的基本行,一次一行。必须有一种更好(更简单、更健壮)的方法来从 Java 中的标准输入流中收集数据,而不是这样:
public static String readLn(int maxLg) {
byte lin[] = new byte[maxLg];
int lg = 0, car = -1;
String line = “”;
try {
while (lg < maxLg) {
car = System.in.read();
if ((car < 0) || (car == ‘\n’)) {
break;
}
lin[lg++] += car;
}
} catch (java.io.IOException e) {
return (null);
}
if ((car < 0) && (lg == 0)) {
return (null); // eof
}
return (new String(lin, 0, lg));
}
我对此感到非常惊讶。它看起来像是直接从 K&R 的“C 编程语言”(无论如何都是一本好书)中提取的东西,减去了访问级别修改器和异常处理等。即使我了解实现,它看起来就像是由 C 程序员编写的,并且绕过了大部分 Java 的面向对象特性。难道没有更好的方法来做到这一点,使用 StringTokenizer 类,或者使用 String 的 split 方法或 java.util.regex 包代替吗?