Вы не можете рассчитывать, что keyboard.hasNext()
сообщит вам, когда ваша программа должна остановиться. Клавиатура, по сути, является бесконечным источником ввода, поэтому keyboard.hasNext()
может никогда возвращать false
. Если есть данные из предыдущей строки ввода, которые еще не были обработаны, они немедленно вернут true
. Но если все данные из предыдущей строки были израсходованы, keyboard.hasNext()
просто будет сидеть и ждать, пока вы наберете другую строку, а затем вернет true
, как только вы нажмете ENTER.
Поскольку вы не можете рассчитывать, что keyboard.hasNext()
скажет вам, что пришло время прекратить обработку слов, вам нужно запрограммировать другой способ решить, когда программа должна остановиться.
Самый хороший способ, с точки зрения вашего пользователя, это прочитать одну целую строку ввода, обработать все слова в этой строке и затем остановиться. Вы используете keyboard.nextLine()
, чтобы прочитать всю строку ввода:
String inputLine = keyboard.nextLine();
После этого у вас есть множество вариантов, как разбить эту строку на отдельные слова. Вот примеры двух способов.
Используйте Scanner(String)
:
String inputLine = keyboard.nextLine();
Scanner wordScn = new Scanner(inputLine);
while (wordScn.hasNext())
{
String someWord = wordScn.next();
// ... process someWord
}
Использование String.split(String delimRegEx)
:
String inputLine = keyboard.nextLine();
String[] words = inputLine.split("\\s+");
for (String someWord : words)
{
// ... process someWord
}
Аргумент "\\s+"
для split
- это регулярное выражение , которое задает разделитель между словами, что означает «пробел (\s
), один или несколько из (+
)» .