在控制台中使用Scanner.nextLine()或Scanner.hasNext()时是否可以不等待输入?

时间:2012-10-10 08:09:02

标签: java console user-input

我正在使用Java来解决SPOJ(http://www.spoj.pl)问题,其中很多问题显然是使用控制台输入。问题是,他们中的一些人没有说会有多少行输入,所以当我没有更多时,我可以关闭程序。我正在使用Scanner:

Scanner s = new Scanner(System.in);
String str = s.nextLine();

不幸的是,它不会读取下一行,但是......等待用户输入,然后获取下一行。

也是如此
s.hasNext();

因此我不知道何时完成该计划。有没有办法在没有等待的情况下读取输入行?

4 个答案:

答案 0 :(得分:1)

它在竞争编程问题上几乎是一个标准,为他们提供输入规范(我相信你知道)。我查看了网站上的一些问题,并指出了这些问题。没有完整的规范,您是否有问题的链接?

在这种情况下,通过电子邮件发送管理员来更新规范会很有用。除此之外,如果你已经到达输入的末尾,Scanner.hasNextLine()应该返回false。

更新输入是从文件传输的,因此hasNextLine()应该按照需要运行。到目前为止它对你没有用吗?你确定你的代码在其他方面没有花太长时间吗?

答案 1 :(得分:0)

你这是错误的。你必须继续阅读,直到没有输入,输入结束被定义为null。等待超时所花费的时间将导致您的代码失败欺骗测试 - spoj对速度非常严格。

说我给你以下问题:

给出一个整数列表,每个整数都在自己的行上,打印出所有整数的总和。

1
2
3
4
5

我们不知道是否或什么时候会有更多的输入。关键是没有人坐在那里输入数字。输入直接从文件传送到程序,并以null结尾(如文件所示)。

对于spoj应该起作用的是:

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line = "";
    int sum = 0;
    while ((line = br.readLine()) != null) {
        sum += Integer.parseInt(line);
    }
    System.out.println(sum);

如果有一些我遗漏的奇怪的诈骗案例,我请求你用spoj问题对此进行评论,我将告诉你如何阅读输入。绝对不是定时器或线程或任何愚蠢的东西。

答案 2 :(得分:0)

如果你没有使用智能算法来找到解决方案,有些问题会花费太多时间。我会建议:

  • 首先,要知道 完全 如何输入
  • 然后,理解 完全 NZEC(以及其他错误代码)的含义。他们有一个forum
  • 此时,如果你的程序在执行时仍然被杀死,这只意味着你需要找到一个更好的算法,这将花费更少的时间。

我建议将输入流作为函数的参数传递 工作并将文件作为程序的可选参数。创建多个文件输入,在文件输入流上测试代码,并尝试检测影响程序运行时间的因素。

答案 3 :(得分:-1)

制作一个计时器变量

Scanner s = new Scanner(System.in);
// Start timer here
String str = s.nextLine();
//If a next line is read, reset timer.

向计时器添加一个事件,如果它到期,程序将关闭。