Чтение char со сканером из txt файла и добавление в 2d массив - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть текстовый файл, который я пытаюсь прочитать с помощью класса сканера.

Я использую двойной цикл for, чтобы прочитать файл и передать его в 2d массив.

Файл выглядит так:

3 3. Р # . ,#,#

первая строка - это длина и ширина массива 2d соответственно.

Я получил эту работу, когда он читает аналогичный текстовый файл, но вместо char он имеет тип int, подобный следующему:

3 3 1 0 1 1 1 1 0 0 1

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

readFile(String filename){
  Scanner scan = new Scanner(new File(filename));
  // read the first two numbers in the file for the size of the array
  int numberRows = scan.nextInt();
  int numberColumns = scan.nextInt();

  char[][] grid = new char[numberRows][numberColums];
  for (int i = 0; i < numberRows; i++) {
      for (int j = 0; j < numberColumns; j++) {
           grid[i][j] = scan.next().charAt(0);
      }
   }
}

Я ожидаю, что это будет работать так же, как и прииспользуя char вместо int.

Однако я получаю ошибку NoSuchElementException, когда scan.next (). charAt (0) фактически запускается, пытаясь прочитать символ из текстового файла.

Я пытаюсьчитать строки вместо символов? Я предполагаю, что отдельный класс будет читаться как символ классом java scanner.

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Scanner.next() всегда возвращает String. Пожалуйста, проверьте https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html для получения дополнительной информации. Перед выполнением любой операции с scan.next(), например, scan.next().charAt(0), вы должны проверить состояние if (scan.hasNext()).

0 голосов
/ 10 ноября 2019

Давайте откроем javadoc для метода Scanner # next.
В нем говорится «Находит и возвращает следующий полный токен с этого сканера. Полному токену предшествует ввод, соответствующий шаблону разделителя. "
Также указывается, что NoSuchElementException генерируется, если токенов больше нет.
На данный момент мы знаем, почему вы получаете это исключение.
Следующий метод обычно используется вместе с методом useDelimiter, который устанавливает упомянутый шаблон.

...