2015-03-30 4 views
3

Вот мой код, который просто читает строки из потока ввода и отображает их, но, к моему удивлению, он не читает все строки. Его чтение только до второй последней строки.Почему Java-сканер не читает все строки?

Вот мой код: -

import java.util.*; 

public class Solution { 

public static void main(String[] args) { 

    Scanner scan = new Scanner(System.in); 
    short n = scan.nextShort(); 
    short m = scan.nextShort(); 
    byte[][] topics = new byte[n][m]; 
    for(short i = 0; i < n; i++){ 
     char[] arr = scan.nextLine().toCharArray(); 
     display(arr); 

    } 
} 

private static void display(char[] arr){ 
    for(int i = 0; i < arr.length; i++){ 
     System.out.print(arr[i]); 
    } 
    System.out.println(); 
    } 
} 

вход дается в этом формате

4 5 
10101 
11100 
11010 
00101 

Мой выход заключается в следующем: -

10101 
11100 
11010 

Его не имея третью линию , Зачем?

+0

@TheLostMind Я просто скопировать вставили выход, так что вы можете увидеть результат. –

ответ

2

Добавить scan.nextLine() перед циклом for, чтобы прочитать конец первой строки (которая содержит «4 5»). Без него первый вызов scan.nextLine() внутри цикла возвращает пустую строку.

+0

Просто пустой вызов scan.nextLine(). Разве нет лучшего способа сделать это. Я имею в виду, что должно быть что-то вроде skip(). –

+0

@TheLostMind Нет, последняя строка не читается, потому что число итераций контролируется первым целочисленным чтением - 4, поэтому цикл считывает конец первой строки, а затем следующие 3 строки. – Eran

+1

@JohnDoe Вы можете заменить два вызова на 'nextShort', которые вызывают один вызов' nextLine', а затем разбивают полученную строку и извлекают из нее целые числа. Тогда вам не понадобится дополнительный вызов nextLine. – Eran

1

Проблема в том, что первый звонок nextLine() читает пустую «линию» между концом «5» (читается для m) и разрывает линию.

Лично я бы либо прекратить использование Scanner полностью (в пользу BufferedReader) - есть огромное количество вопросов немного, как это, с ним не ведет себя точно так, как вы хотели - или только только nextLine(). В любом случае, в основном обрабатывать построчно:

  • прочитать первую строку
  • разделить его на пространство и разбирать две подстроки, как n и m
  • Прочитайте следующий n строки

В принципе, Scanner «ориентирован на токен», тогда как ваш формат ввода более «ориентирован на линию».

Если вы сделать хотите использовать Scanner.nextShort() вы всегда можете прочитать первую строку (либо с BufferedReader или Scanner) и создать новый сканер только из этой строки:

String firstLine = ...; 
Scanner firstLineScanner = new Scanner(firstLine); 
short n = firstLineScanner.nextShort(); 
short m = firstLineScanner.nextShort(); 
... 
+0

Спасибо за подробное и точное объяснение. Поэтому вы предполагаете, что в таких проблемах, где мы должны читать из потока ввода, мы должны предпочесть BufferedReader над сканером. –

+0

Я имею в виду всякий раз, когда нам приходится читать строку из входного потока. –

+1

@JohnDoe: Ну, я обычно предпочитаю BufferedReader, так как он имеет менее запутанный API. –

0

Проблема является scan.nextLine() просто удалить это и поместить scan.next() если вы читаете о методе nextLine это может помочь

public String nextLine() Адаптирует этот сканер к текущей строке и возвращает пропущенный вход. Этот метод возвращает остальную часть текущей строки, за исключением разделителя строк в конце. Позиция устанавливается в начало следующей строки. Поскольку этот метод продолжает поиск через вход, ищущий разделитель строк, он может буферизовать весь входной поиск линии, чтобы пропустить, если нет разделителей строк.

public class Solution 
 
{ 
 

 
public static void main(String[] args) { 
 

 
    Scanner scan = new Scanner(System.in); 
 
    short n = scan.nextShort(); 
 
    short m = scan.nextShort(); 
 
    short[][] topics = new short[n][m]; 
 
    for(short i = 0; i < n; i++){ 
 
     char[] arr = scan.next().toCharArray(); 
 
     display(arr); 
 

 
    } 
 
} 
 

 
private static void display(char[] arr){ 
 
    for(int i = 0; i < arr.length; i++){ 
 
     System.out.print(arr[i]); 
 
    } 
 
    System.out.println(); 
 
    } 
 
}

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