2013-09-25 2 views
0

Я делал this вопрос. Я отправил следующий код, который использует сканер для чтения ввода.Использование буферизованного считывателя не дает Runtime error, но использование Scanner дает онлайн-судье?

import java.io.*; 
import java.math.*; 
import java.util.*; 
import java.lang.*; 

class Main{ 

public static void main(String[] args)throws java.lang.Exception{ 
    Scanner cin = new Scanner(System.in); 
    TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 
    int trees = 0; 
    while(true){ 
     String tree = cin.nextLine(); 
     if(tree==null){ 
      break; 
     } 
     trees++; 
     if(map.containsKey(tree)){ 
      map.put(tree, map.get(tree)+1); 
     }else{ 
      map.put(tree, 1); 
     } 
    } 
    for(String key : map.keySet()){ 

    } 

    Iterator<String> itr = map.keySet().iterator(); 
    while(itr.hasNext()){ 
     String tree = itr.next(); 
     System.out.print(tree + " "); 
     double percent = (double)map.get(tree)/trees*100; 
     System.out.format("%.4f\n", percent); 
    } 

} 
} 

Но я получаю ошибку времени выполнения. Но когда я отправляю тот же код, но на этот раз я использую буферизованный читатель, тогда мой ответ принимается. Это проблема с судьей, или я пропускаю какую-то особенность процедур ввода выходных данных java.

Должен ли я использовать буферизованный считыватель или сканер для более надежного считывания данных?

import java.io.*; 
import java.math.*; 
import java.util.*; 
import java.lang.*; 

class Main{ 

public static void main(String[] args)throws java.lang.Exception{ 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 
    int trees = 0; 
    while(true){ 
     String tree = br.readLine(); 
     if(tree==null){ 
      break; 
     } 
     trees++; 
     if(map.containsKey(tree)){ 
      map.put(tree, map.get(tree)+1); 
     }else{ 
      map.put(tree, 1); 
     } 
    } 
    for(String key : map.keySet()){ 

    } 

    Iterator<String> itr = map.keySet().iterator(); 
    while(itr.hasNext()){ 
     String tree = itr.next(); 
     System.out.print(tree + " "); 
     double percent = (double)map.get(tree)/trees*100; 
     System.out.format("%.4f\n", percent); 
    } 

} 
} 
+1

Какая ошибка? –

+1

Я получаю ошибку времени выполнения. Судья просто говорит, что есть ошибка времени выполнения. –

ответ

3

Прочитайте контракты о методах, которые вы используете. BufferedReader#readLine() возвращает null, если это при EOF; Scanner#nextLine() "throws NoSuchElementException - если линия не была найдена". Если вы хотите использовать Scanner, ваш цикл должен быть проверен cin.hasNextLine().

+0

да! Благодарю. Ответ принят, когда я проверил условие cin.hasNextLine(). –

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