2015-11-05 4 views
0

То, что я пытаюсь сделать, - это ввести много цифр, а затем нажать Enter, а затем сохранить все эти числа в стек сразу. Моя мысль была использовать цикл, чтобы пройти через все цифры и толкать их в стек так:Java-сканер hasNextInt() вызывает бесконечный цикл

Stack<Integer> mainBin = new Stack<Integer>(); 

Scanner scanner = new Scanner(System.in); 

while (scanner.hasNextInt()) {   
mainBin.push(scanner.nextInt()); 
} 

Однако, даже после того, как я нажимаю войти во много раз, не вводя ничего нового, он все еще остается в петле. Какие-либо предложения?

+0

Ну, это буквально весь код, который у меня есть до сих пор. Я столкнулся с этой проблемой, выполняя еще одну программу, и задавался вопросом, что происходит, поэтому я просто пытаюсь выяснить проблему самостоятельно. Больше не нужно кода. Просто хочу знать, почему цикл продолжается, или что является лучшим способом достижения таких же результатов? – Chaus

+2

Возможный дубликат [Как использовать .nextInt() и hasNextInt() в цикле while] (http://stackoverflow.com/questions/26566773/how-to-use-nextint-and-hasnextint-in-a- while-loop) – Tom

+0

@sam Поскольку вы, похоже, являетесь _very_ новым для Java: ideone использует другой 'InputStream' для имитации пользовательского ввода, и он ведет себя по-разному, поэтому попытка воспроизвести этот вопрос с ideone здесь не поможет. – Tom

ответ

1

Scanner.hasNextInt() пропускает пробелы, чтобы найти следующий токен. Поэтому он читает и пропускает все ваши нажатия Enter. Затем он ждет больше ввода, потому что может появиться больше ввода.

В терминале Linux вы можете нажать Ctrl-D (возможно, Cmd-D на OS X?), Чтобы отправить маркер конца файла, который сообщает приложению, что больше нет ввода (это должно быть сделано в начале линии). This answer предполагает, что Ctrl-Z является эквивалентом в командной строке Windows.

В качестве альтернативы, вы можете получить специальный ввод, который читает ваше приложение. @phatfingers прокомментировали, что вы можете указать количество значений для чтения как самый первый вход. У вас также может быть специальное значение для обозначения конца (0 или -1 являются общими вариантами, основанные на потребностях приложения) или, возможно, даже использовать нечисловой токен, например «конец».

+1

Чтобы уточнить, на Mac вы по-прежнему используете 'Ctrl-D' для отправки маркера конца файла. – Ben

0

В вашем примере используется scanner.hasNext(). Вместо этого используйте scanner.hasNextInt().

+0

Извините, это я пытался просто проверить и посмотреть, не изменит ли это. Я использую hasNextInt() и редактировал свой пост, чтобы показать это, но все равно получаю те же результаты. – Chaus

+0

Хорошо, я просто заметил, что ваш комментарий «нажмите ввести много раз». И hasNext() и hasNextInt() заблокируют ожидание ввода. Вы можете поместить свой файл в файл и заменить новый файл (имя файла) для System.in, или ваш цикл проверяет содержимое для чего-то определенного, чтобы выйти из цикла. – phatfingers

+0

Одной из распространенных методик (например, для HackerRank) является указание количества значений для чтения в качестве первого целого числа. – phatfingers

Смежные вопросы