1. 程式人生 > >oi的java輸入hasNext和hasNextLine區別

oi的java輸入hasNext和hasNextLine區別

https://www.nowcoder.com/discuss/8050

比如一道oi題目的輸入是這樣的

7 15 9 5

採用java語言的話,有的同學這樣處理輸入輸出

1

2

3

4

5

Scanner in = new Scanner(System.in);

while (in.hasNextLine()) {

    int n = in.nextInt();

    //處理程式碼略

}

牛客網的系統會提示錯誤,但是如果把hasNextLine改成hasNext或者hasNextInt的話,就會提示正確

1

2

3

4

while (in.hasNextInt()) {

    int n = in.nextInt();

    //處理程式碼略

}

這裡要說明一下java中,hasNextLine和hasNext的區別。

先說結論:

採用has xxxx的話,後面也要用next xxxx。比如前面用hasNextLine,那麼後面要用 nextLine 來處理輸入。

---------------分割線-----------------

說一下兩個方法的區別

hasNext是檢查是否有非空字元。

hasNextLine是檢查輸入中是否還有linePattern。其中LinePattern其實是匹配一個正則表示式。

1

2

3

private static final String LINE_SEPARATOR_PATTERN =

                                          

"\r\n|[\n\r\u2028\u2029\u0085]";

private static final String LINE_PATTERN = ".*("+LINE_SEPARATOR_PATTERN+")|.+$";

判題系統的所有測試用例都是儲存在檔案中,在上面的例子中,測試用例的檔案為

7 15 9 5

當處理完5後,沒有非空字元了,hasNext返回了false,但是在linux系統中,5後面還有一個換行符\n,0X0A(有興趣的同學可以自己建立然後用二進位制方式看一下檔案)

所以hasNextLine會返回true,但是其實後面並沒有可以讀的元素了,從而下面的in.nextInt會拋異常。

轉自:https://www.nowcoder.com/discuss/8050