2014-09-20 44 views
0

我試圖解決關於spoj的問題,但我的答案是不接受錯誤的答案,我想知道這兩個代碼塊之間的區別。這兩個區別

SPOJ接受本

public class Test { 
    public static void main(String[] args) throws java.lang.Exception { 
     java.io.BufferedReader r = new java.io.BufferedReader(
      new java.io.InputStreamReader(System.in)); 
     String s; 
     while (!(s = r.readLine()).startsWith("42")) 
     System.out.println(s); 
    } 
} 

但SPOJ不接受這個

class Test { 
    public static void main(String[] args) throws java.io.IOException { 
     new Test().universe(); 
    } 

    public void universe() throws java.io.IOException { 
     System.out.println("Enter Number"); 
     java.util.Scanner scan = new java.util.Scanner(System.in); 
     String input; 
     while (!(input = scan.next()).startsWith("42")){ 
      System.out.println(input); 
      } 
     scan.close(); 

    } 

} 

這裏的問題http://www.spoj.com/problems/TEST/

+0

對於錯誤我很抱歉我修復了錯字 – 2014-09-20 15:27:31

+0

第一塊代碼重新格式化以提高可讀性。 – 2014-09-20 15:32:58

回答

1

的第一個片段逐行讀取文件中的行,而另一箇中讀取令牌令牌。如果每行有多個標記,結果可能會有所不同。

最後,這兩個代碼都冒着讀取文件的風險,而沒有檢查還有東西要讀。在第一種情況下,它可以拋出NullPointerException,在第二種情況下可以拋出NoSuchElementException

+0

我正在從控制檯讀取 – 2014-09-20 15:33:52

+0

沒有區別。 – Dici 2014-09-20 15:38:58

+0

好吧,那麼爲什麼先嚐試spoj作爲錯誤的答案請解釋 – 2014-09-20 15:59:54

0

區別在於scan.next()是一個阻塞呼叫 - 如果沒有輸入,呼叫將等待直到有輸入。

您需要將掃描儀循環改成這樣:

while (scan.hasNext()) { 
    String input = scan.next(); 
    if (input.startsWith("42")) { 
     System.out.println(input); 
    } 
} 
+0

scan.next();阻止了r.readLine();都返回字符串 – 2014-09-20 16:13:29

+0

他們都會阻止。 – folkol 2014-09-20 16:14:56

+0

來自hasNext的文檔:「此方法可能會在等待輸入掃描時阻塞。」 – folkol 2014-09-20 16:16:25

0

接下來是閱讀的下一個標記,也許你的意思nextLine。

此外,您正在打印「輸入數字」後者。