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

时间:2015-01-12 16:55:37

标签: java input java.util.scanner

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

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

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

输入可以以任何方式给出,任何数字都不超过10 ^ 8,EX:第一个输入可以给出为1并且在同一行中第二个输入可以给出为34,与第一个输入相隔3个空格。然后第二行和第三行是空的,再次在第四行,可以有一个数字说225345这是第三个输入。因此,一旦所有输入都由用户提供,我必须将它们排列在一个列表或数组中并对它们执行一些操作。

示例:

1427 0

876652098643267843

5276538

亲切的帮助。感谢

2 个答案:

答案 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);
}

要验证输入流大小,您可以重用GuavaCommons 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);
}

希望这有帮助。