Loading...
Neven avatar Neven 38 Точки

Проблем с прочитането на String input от конзолата с класа Scanner

Здравейте колеги,

Имам въпрос относно взимането на String input от конзолата, по дълъг от една дума. Нека да обясня:

Да кажем, че имаме следния примерен код:

---------------------------------------------------------------------------------------------------------------------------------

import java.util.Scanner;

public class demo {

     public static void main(String[] args) {

          Scanner console = new Scanner(System.in);

          int length = console.nextInt();

          for (int index = 0; index < length; index++) {

               String currentStr = console.nextLine();
          }
     }
}

---------------------------------------------------------------------------------------------------------------------------------

Въвеждаме стойност за length от конзолата (примерно length = 4). След това влизаме в цикъла по-долу и искаме да въведем 4 на брой String-a (от index 0 до index 3 включително), по-дълги от една дума и съдържащи whitespaces. Примерно "test 123 test 123". Без проблем въвеждаме първите 3 String-a, но for цикълът спира изпълнението си и не успяваме да вземем последната променлива. 

Въпросът ми е: Как можем да взимаме n брой String-ове като input, съдържащи whitespaces без да възниква този проблем? 

П.П. До колкото знам next() методът на Scanner взима String до whitespace и след това веднага продължава на следващия ред. Моля за помощ, така че ако знаете къде бъркам или как се реализиране нещо толкова (привидно) просто, пишете. smile

Тагове:
2
Java Advanced
ttitto avatar ttitto 1153 Точки

console.nextInt(); прочита само числото и нищо друго след него. При първия nextLine() се прочита остатъка от реда на числото, задаващо стойност на индекса. Проблемът се решава като поставиш един console.nextLine() преди for цикъла.

Ето виж кода тук, за да видиш какво точно имам предвид: код

1
nikolay.dimov83 avatar nikolay.dimov83 143 Точки

И аз се сблъсках с този проблем - решавам го, като чета числото от конзолата като стринг с .nextLine, след което го парсвам към int. Сигурно има и по - добро решение, но това е което ми дойде първо.

1
a_rusenov avatar a_rusenov 1103 Точки

Проблемът е, че nextInt() прочита инт-а. След числото остава един \n (екраниращ символ за нов ред), който nextLine() прочита и оттам се губи едната итерация.

Освен това. което предложиха колегите, можеш да използваш парсване като в C#.

int number = Integer.parseInt(input.nextLine());
2
HPetrov avatar HPetrov 822 Точки

Проблема ти идва от това, че nextInt връща числото и курсора си остава на същия ред без да минава на следващия. Вече като отиде на първия nextLine() в цикъла всъщност взима това след числото, което е останало и чак тогава минава на нов ред -> връща "празна" стойност на стринга. Решение на това е след nextInt() да сложиш едно console.nextLine(); където "console" е променливата ти за Scanner-а :) По този начин след като приключиш с вземането на число те праща на нов ред и можеш нормално да си четеш другите неща. Друг начин да вземиш число е Integer.parseInt метода, който е много сходен на int.Parse() в C#.

2
dentia avatar dentia 362 Точки

Мда, т'ва scanner.nextInt() не е оферта. Integer.parseInt(scanner.nextLine()) е истината :)

1
Neven avatar Neven 38 Точки

Супер! 

Много благодаря за бързите отговори smile Тествах и наистина работи коректно, след като просто parse-на ot String (с nextLine()) към int.

0
Emil_Aleksandrov avatar Emil_Aleksandrov 33 Точки

Здравей колега,
аз също имах този проблем,като решението е вместо :
String currentStr = console.nextLine();
да стане :
String currentStr = console.next();

1
Neven avatar Neven 38 Точки

Здрасти smile

Console.next() беше и моето заобиколно решение на този проблем, докато не се сблъсках с някои задачи, в които да кажем трябва да вземеш index-и на String[] масив, които съдържат whitespace. Примерно имаш n брой елементи на такъв масив, които трябва да са цели изречения. Тогава Console.next() не върши работа, защото взима input до първия whitespace и след това прекъсва итерацията. 

Най-добрият вариант е явно предложеното по-горе от колегите - целия input да го слагаш в String променливи с nextLine() и после да parse-ваш към типа, който на теб ти трябва (int, double, char, т.н.). 

Java-ичката има някакви подобни дразнещи подробности, с които тепърва се сблъсквам и е малко фрустрация, но ще се научи. smile

2
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.