读取由换行符、空格等分隔的用户输入

read input by user seperated by line breaks, spaces etc

我正在努力解决以下问题的输入部分。

问题:输入流包含一组整数Ai (0 ≤ Ai ≤ 1018)。这些数字由任意数量的空格和换行符分隔。输入流的大小不超过 256 KB。

如何读取由换行符、空格等分隔的用户输入。如何确保输入流不超过 256 KB? 以及如何确保特定输入将是用户输入的最后一个值,以便程序继续执行?

无论如何都可以输入,任何不超过 10^8 的数字,例如:第一个输入可以是 1,在同一行中,第二个输入可以是 34,由 3 个空格分隔第一个输入。然后第 2 行和第 3 行是空的,在第 4 行中,可以有一个数字 225345,这是第 3 个输入。所以一旦用户给出了所有输入,我就必须接受它们,将它们排列成一个列表或数组并对它们执行一些操作。

示例:

1427 0

876652098643267843

5276538

请帮忙。谢谢

如果每个数字之间至少有一个 space,这应该可以解决问题

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]

使用java.util.Scanner读取long序列(因为10^18 > 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 or 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);
}

希望对您有所帮助。