2014-11-17 2 views
0

Моя программа должна прочитать файл, который выглядит следующим образом:Как заполнить 2 одномерный массив из списка строк

8 7 
~~~~~~~ 
~~~~~~~ 
B~~~~~~ 
~~~~~~~ 
~~~~B~~ 
~~~~B~~ 
~~~~~~B 
~~~~~~~ 

мне нужно игнорировать первую строку (8 и 7) и читать следующие символы в двумерный массив. Я думал, что код, который я написал, сделает это, но это не так. Мне нужна карта [0] [0], чтобы соответствовать первому «~», а для отображения [3] [0] соответствовать первому «B». Это код, который я использую.

try 
    { 
    File file = new File(args[1]); 
    Scanner sc = new Scanner(file);  
    String themap = sc.nextLine(); 
    theFirst = themap.indexOf(" "); 
    theSecond = themap.lastIndexOf(" "); 
    int rows = Integer.parseInt(themap.substring(0, theFirst)); 
    int columns = Integer.parseInt(themap.substring(theSecond+1)); 
    char[][] map = new char[rows][columns]; 

    while (k < rows)         
     { 
     //System.out.println(k); 
     while (j < columns) 
      { 
      while (sc.hasNextLine()) 
       { 
       themap = sc.nextLine();           
       System.out.println(themap); 
       map[k][j] = themap.charAt(j); 
       System.out.println(map[k][j]); 
       } 

      j++; 
      } 
     k++; 
     } 
     sc.close(); 
    } 
catch (Exception e) 
    { 
    System.out.println("ERROR: File does not exist"); 
    } 

Я бросил в тестовом заявлении там, чтобы увидеть, что происходит с картой [J] [K] и выводит только первый символ каждой строки. Как я уже сказал, мне нужно, чтобы он соответствовал файлу, с которого я его читаю, но я не уверен, что я делаю неправильно. Помощь была бы оценена.

+0

Я не думаю, что вы должны игнорировать первую строку, вы должны прочитать в 8 (количество строк) и 7 (количество столбцов) и использовать их, чтобы определить, сколько вы должны читать из следующих строк , –

+0

Я думаю, что, возможно, это плохо сформулировано. Я не игнорирую его полностью, так как я использую его для получения значений int строк и столбцов, но они не будут считаться в массиве. –

ответ

0

Вашей проблемы вы читаете каждую строки из-за внутреннюю петлю while каждый столбец (не 1 строку каждого строки).

Переместить вызов nextLine() за пределы колонкового контура.

Другие улучшения:

  • Кажется очевидным, что первая строка числа или строки и столбцы - вы должны полагаться на и использовать это
  • Не используйте while петли, используйте for петли и имя переменная цикла row и column, чтобы сделать код более читаемым
  • не используйте hasNextLine() как контур управления - проверить его, если необходимо, и выбросить исключение, если линия должна быть там, но не
  • сделать код более модульным, создав метод возвращает массив полукокса Задана строка
  • в учёт бросать исключение, если длина строки неверен
  • использование nextInt() читать номера
+0

Нет, она читает весь файл в каждом столбце. –

+0

@ david yikes. Спасибо – Bohemian

0

You» повторно вызывать nextLine() в пределах вашего внутреннего цикла в первый раз; после чего читать больше нечего. Итак, единственное, что вы заселяете, - map[0][0].

Вы должны полностью избавиться от внутренней линии while и переместить sc.nextLine() внутрь вашего внешнего контура.

Основная структура должна быть такой. Не стесняйтесь добавлять любые звонки и проверку ошибок println. Кроме того, многие люди посчитали бы более интуитивным использовать for петли вместо while.

while (k < rows) { 
    themap = sc.nextLine();           
    j = 0; 
    while (j < columns) { 
     map[k][j] = themap.charAt(j); 
     j++; 
    } 
    k++; 
} 
0

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

for(int i=0;i<rows&&sc.hasNextLine();i++){ 
     themap = sc.nextLine(); 
     for(int j=0;j<columns;j++){ 
      map[i][j] = themap.charAt(j); 
      System.out.print(map[i][j]); 
     } 
     System.out.println(); 
    } 
Смежные вопросы