2014-09-20 2 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

извините за ошибку, я исправил опечатку –

+0

Первый блок кода, переформатированный для удобства чтения. –

ответ

1

Первый фрагмент читает файл построчно в то время как другой читает токен маркер. Если в строке имеется более одного токена, результат может быть другим.

И, наконец, оба кода рискуют прочитать файл без проверки, что еще есть что прочитать. В первом случае он может выбросить NullPointerException, а во втором случае - NoSuchElementException.

+0

Я читаю с консоли –

+0

Не имеет значения. – Dici

+0

ОК, то почему spoj беру сначала как неправильный ответ, пожалуйста, объясните –

0

Разница в том, что scan.next() является блокирующим вызовом - если нет ввода, вызов будет ждать до ввода.

Вы должны изменить свой цикл для сканера к этому:

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

scan.next(); блокирует, что касается r.readLine(); обе строки возврата –

+0

Они оба будут блокированы. – folkol

+0

Из документации hasNext: «Этот метод может блокироваться, ожидая ввода для сканирования». – folkol

0

Следующая читает следующий маркер, может быть, вы имели в виду nextLine.

Кроме того, вы печатаете «Введите номер» в последнем.

Смежные вопросы