Как да четем интервали със scanner.next()

Имам скенер и съм задал разделителя на "", но той все още не чете празни интервали с метода next(). Знам, че nextline() работи, но трябва да проверя всеки знак във входа поотделно, включително интервал; това е за сложен проблем за анализ на данни. Смаян съм обаче. Google не намери нищо.

Може ли някой да ми помогне с това? Мисля да обърна празното пространство в специален знак, след което за целите на анализа на знака да го обърна обратно в интервал, съдържащ се в низ... Това обаче изглежда прекалено! Има ли по-елегантен начин да направите това?

РЕДАКТИРАНЕ: Основната ми задача е да взема низ и да го прегледам символ по знак няколко пъти, за да прегледам данните за различни задачи. Ще трябва да го изследвате много пъти, един знак наведнъж, и затова реших, че класът на скенера ще бъде най-добрият ми залог, тъй като може да бъде лесен за работа (поне за мен). Това ми е задачата. Има ли по-лесен начин за това?


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