Персонаж смотри в будущее - PullRequest
1 голос
/ 01 ноября 2011

Как бы я занялся созданием метода упреждающего просмотра символов в Java? У меня есть текстовый файл (скажем, TextFile.txt), и мне нужно, чтобы он сначала читал по одному символу, распознавал его, если это специальный символ (например, {= +; ​​и т. Д.), Возвращал его как маркер типа Y. Если символ не является специальным (например, цифра или буква), то он должен смотреть вперед, чтобы увидеть, есть ли специальный символ или пробел, и когда он появляется, программа должна вернуть этот набор символов как токен типа X. Если программа читает цифру, за которой следует другая цифра, а затем буква, она должна возвращать только две цифры типа Z.

Например, в TextFile.txt есть следующий текст:

{ test; 123test test5
test/-=test}

Программа прочитает файл, увидит '{', вернет этот токен как Y, увидит пробел, проигнорирует это, увидит 't', потому что это не специальный символ, посмотри вперед и увидишь другую букву , пока он не достигнет ';' и не вернет 'test' в качестве токена типа X. Программа должна прочитать '123', вернуть его как Z, затем прочитать 'test' и вернуть X.

Я понимаю, как должна работать программа, но я не знаю, что использовать для считывателя символов. Я посмотрел на класс Scanner, но у него нет метода для nextChar () (который был бы полезен).

Ответы [ 7 ]

1 голос
/ 01 ноября 2011

Поскольку вам нужен только один символ предвидения, я предлагаю использовать PushbackReader.Вы также можете использовать ридер, который поддерживает маркировку, , но в этом приложении я думаю, что откат легче понять.Обе эти опции работают, когда предвидение зафиксировано (в данном случае один символ).

Проще говоря, вы читаете символ из потока и решаете, какой это тип токена (если это пробел, выбросьте егои попробуй еще раз).Скопируйте этот и последующие символы токена во что-то вроде StringBuilder.Продолжайте читать, пока не прочитаете символ, который не относится к этому типу. Переместите плохой символ обратно в поток, и верните токен.В следующий раз, когда вы запросите токен, символ возврата будет находиться в начале потока.

Обработка потока таким образом является эффективным с точки зрения памяти, поскольку упреждающий просмотр фиксирован.Требуемое пространство не зависит от длины потока (фактически, оно будет работать с бесконечно длинными потоками).

1 голос
/ 01 ноября 2011

Я думаю, вам не нужны никакие заглядывающие символы, и вы можете просто прочитать весь текст в строку и перебрать его массив символов.Проверьте каждый символ для isDigit или isLetter - если он добавляется в строковый буфер, иначе сбросьте содержимое буфера в список, содержащий все токены.если буфер пуст и символ является цифрой, установите флаг и очистите его, как только вы столкнетесь с чем-либо, кроме цифры.это должно сделать, я думаю.

0 голосов
/ 24 апреля 2012

Звучит как разбор языка.Я бы посоветовал использовать ANTLR.Пожалуйста, посмотрите на http://www.antlr.org/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3

0 голосов
/ 01 ноября 2011

Ваш вопрос не очень описательный ... но я думаю, что это может дать вам отправную точку. Разделите содержимое вашего текстового файла на массив символов. Затем посмотрите на каждого персонажа индивидуально и проведите тест / сравнение

char[] cArray = textToRead.toCharArray();

for(int i = 0; i < cArray.length; i++){
    //perform your logic here
}

итерация по каждому символу и отслеживание того, что вам нужно, в строковых или символьных переменных.

0 голосов
/ 01 ноября 2011

вам не нужны никакие специальные функции просмотра. вам просто нужно открыть файл как FileReader. затем, когда вы обрабатываете каждый символ, если он не является специальным символом, вам нужно накапливать эти символы в отдельном StringBuilder, пока вы не достигнете специального символа и не сможете определить тип текущего токена.

0 голосов
/ 01 ноября 2011

Сканер не имеет nextChar(), но вы можете использовать Scanner.hasNext(String).Например,

scanner.hasNext("x")

проверит, следует ли буква x.Для более сложных запросов вы можете использовать Scanner.hasNext(Pattern).

0 голосов
/ 01 ноября 2011

Вы хотите использовать тип InputStream (вероятно, FileInputStream в вашем случае) и использовать метод read() для выделения символов по одному за раз. Если эти символы не являются специальными символами / пробелами, сохраняйте их в буфере до тех пор, пока не найдете специальные символы / пробелы, а затем верните содержимое буфера в качестве токена типа X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...