问题:输入流包含一组整数Ai(0≤Ai≤1018)。数字由任意数量的空格和换行符分隔。输入流的大小不超过256 KB。
我如何读取用户的输入,这些输入由换行符,空格等分隔。如何确保输入流不超过256 KB? 以及如何确保特定输入将是用户输入的最后一个值,以便程序继续执行?
输入可以以任何方式给出,任何数字都不超过10 ^ 8,EX:第一个输入可以给出为1并且在同一行中第二个输入可以给出为34,与第一个输入相隔3个空格。然后第二行和第三行是空的,再次在第四行,可以有一个数字说225345这是第三个输入。因此,一旦所有输入都由用户提供,我必须将它们排列在一个列表或数组中并对它们执行一些操作。
示例:
1427 0
876652098643267843
5276538
亲切的帮助。感谢答案 0 :(得分:1)
如果每个数字之间至少有一个空格
,这应该可以解决问题Scanner scanner = new Scanner(new File("data.txt")); // or new Scanner(System.in) for reading from command line.
List<Integer> list = new ArrayList<Integer>();
while (scanner.hasNext()) {
int number = scanner.nextInt();
if (number<0||number>1018)
break;
list.add(number);
}
scanner.close();
System.out.println(list);
示例:(data.txt)
145 358
94 2
13 1205 158 489
输出:
[145, 358, 94, 2, 13, 1205, 158, 489]
答案 1 :(得分:0)
使用java.util.Scanner读取long的序列(因为10 ^ 18&gt; Integer.MAX_VALUE):
Scanner scanner = new Scanner(input);
while (scanner.hasNextLong()) {
long number = scanner.nextLong();
if (number < 1 || number > 1_000_000_000_000_000_000L)
throw new RuntimeException("input out of range: " + number);
}
要验证输入流大小,您可以重用Guava或Commons IO中的CountingInputStream,或自行编码。请注意,由于Scanner中的内部缓冲,您最终可能会读取超过256 KB的输入。
CountingInputStream input = new CountingInputStream(System.in);
Scanner scanner = new Scanner(input);
while (scanner.hasNextLong() && input.getCount() < 256 * 1024) { ... }
确保特定输入将是最后一个值,需要您选择分隔符。我会使用可接受输入中的数字,比如-1:
CountingInputStream input = new CountingInputStream(System.in);
Scanner scanner = new Scanner(input);
while (scanner.hasNextLong() && input.getCount() < 256 * 1024) {
long number = scanner.nextLong();
if (number == -1)
break;
if (number < 1 || number > 1_000_000_000_000_000_000L)
throw new RuntimeException("input out of range: " + number);
}
希望这有帮助。