2015-10-13 45 views
1

我从算法1通过塞奇威克使用具有方法isEmpty()这是为了确定是否有再留在标准输入到过程参数的stdlib.jar库运行的程序。java中的扫描器如何返回到hasNext()?

这里是包含在类的源文件代码的代码称为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命令行键入?还是有一个标准的方式来告诉完成的命令行参数的扫描仪输入?

+2

如果您使用控制台作为输入缓冲器,它永远不会是空的。您需要编写一些用户可以输入的退出代码,退出程序。 –

+0

尝试按CTRL-Z https://en.wikipedia.org/wiki/End-of-file即可以结束控制台输入。 – zapl

+0

'StdIn'中的'Scanner'很可能使用'System.in'流,JVM进程正在使用它来通常从控制台读取数据。但是,我们什么时候可以100%确定在该流中不会有用户输入?由于用户可能正在通过控制台写入一些数据,因此System.in需要等到a)用户按回车并发送他的数据b)System.in将检测到该流已关闭(这意味着不再有数据可以使用从中读取)。在情况B你可以使用像http://stackoverflow.com/a/33084716/1393766 – Pshemo

回答

0

答案是:当它挂在窗口处处理的参数类型CTRL + Z它是Windows EOF标准输入告诉扫描器没有更多的输入后提示。

+0

Ctrl + Z可能会阻止您再次从控制台读取数据。如果你想拥有'while(hasMoreElements){doSomethingInLoop();} doSomethingAfterLoop();而(hasMoreElemenets){doAnotherThingInLoop();}然后'在第二环路'doAnotherThingInLoop()'将极有可能被不执行,因为'hasMoreElemenets'将开始返回'FALSE'。这就是为什么最好是阅读,直到提供一些特殊的值,这将使我们的控制流程从循环中退出,或者预先定义我们想要从用户读取多少值。 – Pshemo