【问题标题】:How does the Scanner in java return true to hasNext()?java中的Scanner如何对hasNext()返回true?
【发布时间】:2015-10-13 19:54:43
【问题描述】:

我正在使用 Sedgwick 的算法 1 运行一个程序,该程序使用 stdlib.jar 库,该库有一个方法 isEmpty(),它应该确定标准输入中是否还有要处理的参数。

这是来自源文件代码的代码,该代码包含在一个名为 StdIn 的类中:

public static boolean isEmpty() {
    return !scanner.hasNext();
}

如果我在 Windows 的命令行编译成功后键入以下参数:

10  2 4 6 8 9 0

然后按回车,程序在while循环中正确处理来自主函数的数据,StdOut.println(p + " " + q);行工作正常。

public static void main(String[] args) {
    int N = StdIn.readInt();
    QuickUnionUF uf = new QuickUnionUF(N);
    while (!StdIn.isEmpty()) {
        int p = StdIn.readInt();
        int q = StdIn.readInt();

        if (uf.connected(p, q)) continue;
        uf.union(p, q);
        StdOut.println(p + " " + q);


    }

}

但是,包含条件 (!StdIn.isEmpty()) 的 while 循环永远不会变为真,并且在打印答案后只是挂起等待更多输入。这意味着 while 条件永远不会确定已从命令行到达输入的结尾。

问题

我如何告诉程序我已经完成了我的参数并且没有更多的输入?在最后一个参数之后,我需要在 Windows 命令行中键入一个特殊的转义序列吗?或者有没有一种标准的方法来告诉扫描仪输入的命令行参数已经完成?

【问题讨论】:

  • 如果您使用控制台输入作为输入缓冲区,它永远不会为空。您需要编写一些用户可以输入的退出代码来退出您的程序。
  • 尝试按 CTRL-Z en.wikipedia.org/wiki/End-of-file 来结束控制台输入。
  • Scanner in StdIn 很可能使用了System.in 流,JVM 进程通常使用该流从控制台读取数据。但是我们什么时候可以 100% 确定该流中不会有来自用户的输入呢?由于用户可能正在通过控制台System.in 写入一些数据,因此需要等到 a) 用户按下回车键并发送他的数据 b) System.in 将检测到流已关闭(这意味着无法读取更多数据从中)。如果是 B,您可以使用 stackoverflow.com/a/33084716/1393766
  • ctrl Z 成功了!它是停止当前程序还是实际上告诉扫描仪返回 true?
  • ctrl Z 不是很好的设计决策。最好让用户提供一些特殊的值来让程序退出。

标签: java


【解决方案1】:

答案是:当它在处理参数类型 ctrl + z 后挂在 Windows 提示符处时,这是标准输入的 Windows EOF,告诉扫描仪没有更多输入。

【讨论】:

  • Ctrl+Z 可能会阻止您再次从控制台读取。如果你想要while(hasMoreElements){doSomethingInLoop();} doSomethingAfterLoop(); while(hasMoreElemenets){doAnotherThingInLoop();} 这样的东西,那么在第二个循环中doAnotherThingInLoop() 很可能不会被执行,因为hasMoreElemenets 将开始返回false。这就是为什么最好在提供一些特殊值之前进行读取,这将使我们的控制流退出循环,或者更早地预先定义我们想从用户那里读取多少值。
猜你喜欢
  • 2013-03-28
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多