Чтение данных построчно в Java из входного потока

Мне нужно прочитать данные в формате:
2
4
7
6 4
2 5 10
9 8 12 2

данные должны быть из потока ввода по умолчанию, System.in. Я использую InputStreamReader, завернутый в BufferedReader, поэтому я могу выполнять построчное чтение.

InputStreamReader isr=new InputStreamReader(System.in);
    BufferedReader in=new BufferedReader(isr);
    String x=in.readLine();
    int numcase=Integer.parseInt(x);
    for(int i=1;i<=numcase;i++){
        System.out.println("");
        x=in.readLine();
        int n=Integer.parseInt(x);
        int[][]t=new int[n+1][n+1];
        for(int j=1;j<=n;j++){
            System.out.println();
            x=in.readLine();
            StringTokenizer st=new StringTokenizer(x);
            for(int k=1;k<=1;k++){
                x=st.nextToken();
                int nume=Integer.parseInt(x);
                t[j][k]=nume;
            }
        }

проблема в том, что если пустой оператор System.out.println отсутствует, он отказывается читать строку ввода после чтения первых двух строк. Дело в том, что когда я отправляю код, он отслеживает поток вывода и поэтому оценивает мой вывод как неправильный, выводя неправильный ответ.


person Nick Name    schedule 29.04.2013    source источник
comment
Почему бы просто не использовать Scanner, обычный способ чтения ввода с разделителями?   -  person Patashu    schedule 29.04.2013
comment
Да, используя объект Scanner, а затем использование myScanner.nextInt() для получения следующего целого числа - гораздо более простой метод   -  person jessechk    schedule 29.04.2013
comment
ввод подается через входной поток построчно, а не номер за номером, иначе Scanner был бы намного проще.   -  person Nick Name    schedule 29.04.2013


Ответы (3)


Я не уверен, чего вы ожидаете, но запись в system.out не влияет на то, что вы читаете из system.in.

Это сказало несколько указателей о вашем коде:

 String x=in.readLine();
 int numcase=Integer.parseInt(x);
 for(int i=1;i<=numcase;i++){

этот цикл будет введен дважды.

x=in.readLine();
int n=Integer.parseInt(x);
int[][]t=new int[n+1][n+1];

n будет равно 4, а размер массива будет 5 на 5. Почему? Я не могу понять причину этого.

 for(int j=1;j<=n;j++){

этот цикл будет выполнен 4 раза. Каждый раз читаем одну строчку.

 StringTokenizer st=new StringTokenizer(x);
        for(int k=1;k<=1;k++){

Этот цикл всегда будет вводиться только ОДИН РАЗ, даже если может быть более одного токена.

int nume=Integer.parseInt(x);
            t[j][k]=nume;

поскольку k всегда равно 1, вы будете заполнять только одну строку/столбец в своем массиве 2d.

Вывод. операторы печати не творят чудес.

Код делает то, что должен делать.

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

Я почти уверен, что вы пытаетесь заполнить двумерный массив числами, и проблема заключается в условии над k, но, поскольку я действительно не знаю, что вы пытаетесь сделать, я не могу быть уверен на 100%.

Изменить

командная строка

person Osama Javed    schedule 29.04.2013
comment
for(int k=1;k‹=j;k++) я знаю, это странно, но код работает с операторами печати, но не без них - person Nick Name; 29.04.2013
comment
Я удалил операторы печати и запустил код. Он сделал то, что я ожидал. Для вашего ввода он не выходит, но читает все строки. - person Osama Javed; 29.04.2013
comment
это то, что я получаю, когда запускаю его без операторов печати: Исключение в потоке main java.lang.NumberFormatException: для входной строки: в java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) в java.lang. Integer.parseInt(Integer.java:470) в java.lang.Integer.parseInt(Integer.java:499) в Monkie.main(monkie.java:36) в значительной степени говорит о том, что я пытаюсь проанализировать пустую строку ... - person Nick Name; 29.04.2013
comment
достаточно справедливо .. это потому, что вы пытаетесь прочитать в общей сложности 10 строк, однако ваш ввод составляет всего 6 строк. Я предполагаю, что в конце вашего ввода есть пустая строка, которая даст пустую строку в строке 7 вашего кода. затем в строке 8 вы попытаетесь преобразовать пустую строку в целое число... что невозможно, следовательно, исключение. Как упоминалось ранее, подумайте о том, что вы пытаетесь сделать, и проверяйте переменные по мере выполнения кода. - person Osama Javed; 29.04.2013
comment
технически никогда не бывает пустой строки, так как я ввожу данные. ошибка возникает после ввода 1(вместо 2), затем 4.т.е. первых двух строк данных - person Nick Name; 29.04.2013
comment
я удалил операторы печати .. запустил: 1\n 4\n 7\n 7\n 7\n 7\n и у меня это сработало нормально - person Osama Javed; 29.04.2013
comment
Я добавил свой вывод к ответу выше - person Osama Javed; 29.04.2013
comment
я ввожу 1\n 4\n а затем код завершается и отображается сообщение об ошибке - person Nick Name; 29.04.2013
comment
Хорошо, ребята, спасибо за ваше терпение и помощь, я переключил компилятор, и код работает отлично. - person Nick Name; 29.04.2013
comment
ха-ха... забавный компилятор... какой из них вы использовали... из чистого любопытства. - person Osama Javed; 29.04.2013

  • Хорошо, во-первых, никогда не используйте StringTokenizer, так как он устарел.
  • Secondly, arrays are zero indexed. So use for (i = 0, i < size; i++) not i=1 and i <= size. I'm going to guess your last programming language was Visual Basic.
    • Your array is too big for the size of your input data. Use new int[n][n] with the above zero indexing.
  • Ваш двумерный массив выйдет за пределы области видимости, как только вы снова выполните итерацию цикла for.
  • Если вы собираетесь использовать readLine, вам будет намного лучше с String.split(" ")

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

person durron597    schedule 29.04.2013

Никнейм

Учитывая ваш набор данных, вот как вы читаете ввод...

2 line 3
4 line 7
7 line 12 после этой строки вы пытаетесь маркировать x (который содержит только "7"), но затем вы вырываете
6 4 из цикла k, чтобы прочитать остальную часть ввода (действительно странным образом)
2 5 10
9 8 12 2

Мне просто любопытно, должны ли вы сохранять токены в [row][cols] на этом массиве t[][]!

 1 InputStreamReader isr=new InputStreamReader(System.in);
 2  BufferedReader in=new BufferedReader(isr);
 3  String x=in.readLine();
 4  int numcase=Integer.parseInt(x);
 5  for(int i=1;i<=numcase;i++){
 6      System.out.println("");
 7      x=in.readLine();
 8      int n=Integer.parseInt(x);
 9      int[][]t=new int[n+1][n+1];
10      for(int j=1;j<=n;j++){
11          System.out.println();
12          x=in.readLine();
14          StringTokenizer st=new StringTokenizer(x);
15          for(int k=1;k<=1;k++){
16              x=st.nextToken();
17              int nume=Integer.parseInt(x);
18              t[j][k]=nume;
19          }
20      }
21
person daniel_alamo    schedule 29.04.2013
comment
да, помните, я храню его в том виде, в котором он читается, как есть, он работает, но если я удалю операторы System.out.println, он не будет читать ввод. Вот настоящая проблема. Помните также, что у 7 есть один токен, поэтому в этой строке я прочитал только один токен. первое число — это количество случаев, второе — количество строк, содержащих данные после этого, а следующие строки содержат данные, поэтому я точно знаю, сколько целых чисел в строке. Токенизатор работает нормально. - person Nick Name; 29.04.2013