Как читать пробелы с помощью scan.next()

У меня есть сканер, и я установил разделитель на "", но он по-прежнему не будет читать пробелы с помощью метода next(). Я знаю, что nextline() работает, но мне нужно проверить каждый символ во входных данных по отдельности, включая пробелы; это для сложной проблемы анализа данных. Я в тупике, хотя. Гугл ничего не выдал.

Кто-нибудь может мне с этим помочь? Я думаю о том, чтобы преобразовать пробел в специальный символ, а затем в целях анализа символа превратить его обратно в пробел, содержащийся в строке... Однако это кажется излишним! Есть ли более элегантный способ сделать это?

РЕДАКТИРОВАТЬ: Моя основная задача состоит в том, чтобы взять строку и просмотреть ее посимвольно несколько раз, чтобы изучить данные для различных задач. Вам придется проверять его много раз, по одному символу за раз, поэтому я подумал, что лучше всего подойдет класс сканера, поскольку с ним легко работать (по крайней мере, для меня). Это моя задача. Есть ли более простой способ сделать это?


person Codefun64    schedule 21.10.2012    source источник
comment
Вы читаете данные из файла или пользовательского ввода?   -  person Luiggi Mendoza    schedule 21.10.2012
comment
Точно. Функция сканера состоит в том, чтобы доставлять вам токены и игнорировать пробелы. Если вам нужно обработать каждый символ, вы не можете использовать механизм ввода, который не дает вам их все. Похоже, вам нужно написать себе полноценный собственный сканер, как в рукописном сканере компилятора. Более подробная информация о вашей проблеме, а не о неработающем решении, даст лучшие ответы.   -  person user207421    schedule 21.10.2012
comment
Функция сканера состоит в том, чтобы доставлять вам токены и ИГНОРИРОВАТЬ разделитель (который по умолчанию равен space).   -  person Aniket Inge    schedule 21.10.2012
comment
Обновлено с дополнительной информацией о моей основной задаче.   -  person Codefun64    schedule 21.10.2012


Ответы (4)


Scanner scanner = new Scanner(file).useDelimiter("'")

Но это крайне неэффективно. Лучшим способом продвижения вперед было бы: читать символ за символом:

private static void readCharacters(Reader reader)
        throws IOException {
    int r;
    while ((r = reader.read()) != -1) {
        char ch = (char) r;
        doSomethingWithChar(ch);
    }
}

См. также ЗДЕСЬ

person Aniket Inge    schedule 21.10.2012
comment
Эй, извините, что не понял этого сразу, но почему использование сканера с разделителем ' отличается / лучше, чем использование его в качестве разделителя, для захвата пробелов? Кроме того, почему это неэффективно? - person Codefun64; 21.10.2012

вместо

scanner.next();

использовать

scanner.nextLine();

Таким образом, вы решаете проблему с разделителями.

person Vallisha Mohan    schedule 22.02.2017
comment
Простое и лучшее решение! - person zackygaurav; 01.06.2019

Попробуйте .useDelimiter("(\\b|\\B)")

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

Следующий код напечатает именно то, что набрал пользователь. Ни один символ не будет проигнорирован, включая пробелы.

Scanner charScanner = new Scanner( System.in ).useDelimiter( "(\\b|\\B)" ) ;
while( charScanner.hasNext() ) 
    System.out.print( charScanner.next() ) ;
person kaltu    schedule 27.02.2016

Используйте BufferedReader для чтения строки ввода, затем повторяйте строку в цикле for, работая с каждым char.
Вы можете проверить, является ли символ пробелом, с помощью Character.isWhitespace(char c).

person Mordechai    schedule 21.10.2012