2015-10-13 53 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