Разбор текстового файла в список массивов [дубликат]

Простыми словами ... Если я пишу новый класс Swimmer для добавления функциональности swim () и вам нужно использовать объект класса say Dog, и этот класс Dog реализует интерфейс Animal, который объявляет swim () [To лучше понять ... вы можете нарисовать диаграмму о том, о чем я говорю]. В верхней части иерархии (Animal) он очень абстрактный, а внизу (Dog) он очень конкретный. То, как я думаю о «программировании для интерфейсов», заключается в том, что, когда я пишу класс Swimmer, я хочу написать свой код против интерфейса, который находится так далеко от иерархии, которая в этом случае является объектом Animal. Интерфейс свободен от деталей реализации и, таким образом, делает ваш код слабосвязанным. Детали реализации могут быть изменены со временем, однако это не повлияет на оставшийся код, поскольку все, с чем вы взаимодействуете, связано с интерфейсом, а не с реализацией. Вам все равно, что такое реализация ... все, что вы знаете, это то, что будет класс, который будет реализовывать интерфейс.

61
задан John Kugelman 13 August 2015 в 20:38
поделиться

5 ответов

Короткий ответ

У вас есть пустая строка в конце файла.


Причина для пустой строки

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

Редакторы ведут себя таким образом, потому что это часть POSIX Стандарт:

3.206 Линия

Последовательность из нуля или более символов без символа окончания.

Этот раздел был обсуждался в этот поток .


Документация по Java-сканеру

Вот документация из класса g2 для Java 8 Scanner .

hasNext()

Возвращает true, если этот сканер имеет другой токен на своем входе.


hasNextLine()

Возвращает true, если на входе этого сканера есть еще одна строка.


Причина поведения кода Java

Из-за вышеописанных фактов hasNextLine() return true, но hasNext() не может найти ничего, что он может распознать как Token и поэтому возвращает false.

Для дополнительной информации см. durron597 post.

58
ответ дан Community 22 August 2018 в 08:27
поделиться
  • 1
    Во-первых, спасибо за подробный ответ. Поэтому я понимаю, что может быть Line_Separator_Pattern без присутствия другого токена. Однако в файле я не могу продвинуть курсор мимо окончательного «1». Есть ли какой-нибудь пробельный символ, который я не могу удалить через gedit? – DRich 13 August 2015 в 16:31
  • 2
    "You have a single extra newline at the end of your file." - Я думаю, что это более общее, чем это, в том числе - в конце файла есть любое количество пробелов (или какой бы ограничитель вы указали). – Dukeling 13 August 2015 в 23:26
  • 3
    @ Dukeling да, но OP заявил где-то, что проверил свой файл, и у него не было лишнего пробела – durron597 14 August 2015 в 00:02
58
ответ дан Community 5 November 2018 в 05:56
поделиться

Причина в том, что hasNext() проверяет, имеются ли какие-либо символы без пробелов. hasNextLine() проверяет, имеется ли другая строка текста.

Многие текстовые редакторы автоматически добавляют новую строку в конец файла, если нет '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' t / уже.

Другими словами, ваш входной файл не является этим (числа являются номерами строк):

1. a   3   9
2. b   3   6
3. c   3   3
4. d   2   8
5. e   2   5

На самом деле это:

1. a   3   9
2. b   3   6
3. c   3   3
4. d   2   8
5. e   2   5
6. 
14
ответ дан Daniel Centore 22 August 2018 в 08:27
поделиться

Вы потребляете значение next(), но запрашиваете hasNext() и hasNextLine(). next(), по умолчанию, возвращает все к следующему whitespace(). Таким образом, вы выполняете итерацию через все разделенные пробелы строки, и после каждого из них вы спрашиваете о nextLine().

i 1 1 -> hasNextLine()? Правда. hasNext()? Также верно.

1 1 -> hasNextLine()? Правда. hasNext()? Также верно (все еще осталось пробел)

1 -> hasNextLine()? True (Линейный разделитель, возможно). haxNext? False, без пробелов.

5
ответ дан Florian Schaetz 22 August 2018 в 08:27
поделиться

Основная концепция hasNext () и hasNextLine () is

hasNextLine: - Возвращает true, если на входе этого сканера есть другая строка. Этот метод может блокироваться при ожидании ввода.

Возвращает: true тогда и только тогда, когда этот сканер имеет другую строку ввода. Throws: IllegalStateException - если этот сканер закрыт

hasNext

]

Возвращает true, если следующий полный токен соответствует указанному шаблону.

Полный токен имеет префикс и постфиксацию с помощью ввода, который соответствует шаблону разделителя. Этот метод может блокироваться при ожидании ввода.

Параметры: pattern - шаблон для сканирования для

Возвращает: true тогда и только тогда, когда этот сканер имеет другой токен, соответствующий указанному шаблону

Поскольку ваш последний вход говорит true для nextLine (), потому что вызов scan.nextLine (); возвращает следующий токен. Важно отметить, что сканер возвращает пробел и букву, потому что она читается с конца последнего токена до начала следующей строки.

0
ответ дан Manpreet gujral 22 August 2018 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: