Я беру ввод пользователя с System.in с помощью java.util.Scanner . Мне нужно проверить вход для таких вещей, как:
- Это должно быть неотрицательное число
- Это должно быть алфавитная буква
- . и т.д.
Какой лучший способ сделать это?
- Обзор методов Scanner.hasNextXXX
- Пример 1: Проверка положительных целых чисел
- Связанные вопросы
- Пример 2: Несколько hasNextXXX на одном и том же токене
- Пример 3: Проверка гласных
- Ссылки API
- Связанные вопросы
- Ссылки
- Пример 4. Использование двух Scanner сразу
- 1 ответ 1
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками scanner или задайте свой вопрос.
- Похожие
- четверг, 7 июля 2011 г.
- Как можно проверить является ли строка числом на java?
Обзор методов Scanner.hasNextXXX
java.util.Scanner имеет много методов hasNextXXX , которые могут использоваться для проверки ввода. Вот краткий обзор всех из них:
- hasNext() — у него есть любой токен вообще?
- hasNextLine() — есть ли еще одна строка ввода?
- Для Java-примитивов
- hasNextInt() — у него есть токен, который можно разобрать в int ?
- Также доступны hasNextDouble() , hasNextFloat() , hasNextByte() , hasNextShort() , hasNextLong() и hasNextBoolean()
- В качестве бонуса также есть hasNextBigInteger() и hasNextBigDecimal()
- Интегральные типы также имеют перегрузки для указания оснований (например, шестнадцатеричных)
Scanner способен к большему, включенному тем, что он основан на регулярном выражении. Важной особенностью является useDelimiter(String pattern) , которая позволяет определить, какой шаблон разделяет ваши токены. Существуют также методы find и skip , которые игнорируют разделители.
Следующее обсуждение будет поддерживать регулярное выражение как можно более простым, поэтому фокус остается на Scanner .
Пример 1: Проверка положительных целых чисел
Вот простой пример использования hasNextInt() для проверки положительного int на входе.
Вот пример сеанса:
Введите положительное число!
пять
Это не число!
-3
Введите положительное число!
5
Спасибо! Получил 5
Заметьте, насколько проще Scanner.hasNextInt() использовать по сравнению с более подробными try/catch Integer.parseInt / NumberFormatException комбо. По контракту a Scanner гарантирует, что если он hasNextInt() , то nextInt() мирно предоставит вам int и не будет бросать никаких NumberFormatException / InputMismatchException / NoSuchElementException .
Связанные вопросы
Пример 2: Несколько hasNextXXX на одном и том же токене
Обратите внимание, что вышеприведенный фрагмент содержит инструкцию sc.next() для продвижения Scanner до тех пор, пока не будет hasNextInt() . Важно понимать, что ни один из методов hasNextXXX не продвигает Scanner мимо любого ввода!. Вы обнаружите, что если вы опустите это line из фрагмента, затем он перейдет в бесконечный цикл на недопустимом вводе!
Это имеет два следствия:
- Если вам нужно пропустить вход "мусор", который не прошел тест hasNextXXX , вам необходимо заранее продвинуть Scanner (например, next() , nextLine() , skip и т.д.)).
- Если один тест hasNextXXX завершился с ошибкой, вы все равно можете проверить, возможно ли это hasNextYYY !
Здесь приведен пример выполнения нескольких тестов hasNextXXX .
Вот пример сеанса:
5
(int) 5
ложь
(boolean) false
бла
(String) blah
1.1
(двойной) 1.1
100000000000
(длинный) 100000000000
выход
Обратите внимание, что порядок испытаний имеет значение. Если a Scanner hasNextInt() , то это также hasNextLong() , но это не обязательно true наоборот. Чаще всего вы хотите сделать более конкретный тест перед более общим тестом.
Пример 3: Проверка гласных
Scanner имеет множество расширенных функций, поддерживаемых регулярными выражениями. Вот пример его использования для проверки гласных.
Вот пример сеанса:
Введите гласный, в нижнем регистре!
5
Это не гласный!
г
Это не гласный!
е
Спасибо! Получил e
В regex, как строковый литерал Java, шаблон "[aeiou]" — это так называемый "класс символов"; он соответствует любой из букв a , e , i , o , u . Обратите внимание, что это тривиально, чтобы сделать вышеупомянутый тест нечувствительным к регистру: просто укажите такой шаблон регулярного выражения на Scanner .
Ссылки API
- hasNext(String pattern) — возвращает true , если следующий токен совпадает с шаблоном, построенным из указанной строки.
- java.util.regex.Pattern
Связанные вопросы
Ссылки
Пример 4. Использование двух Scanner сразу
Иногда вам нужно сканировать строки за строкой, с несколькими токенами на линии. Самый простой способ сделать это — использовать два Scanner , где второй Scanner принимает nextLine() из первого Scanner в качестве входного. Вот пример:
Вот пример сеанса:
Дайте мне кучу чисел в строке (или "exit" )
3 4 5
Сумма составляет 12
10 100 млн. Долларов
Сумма составляет 110
ждать, что? Сумма 0
Выход
Написал программу, которая принимает два числа, а потом оперирует. Но если я ввожу букву, то выдаёт ошибку, как сделать так, чтобы если вводил не цифры, то заново выводило сообщение на ввод числа, а не выдавало ошибку? Спасибо.
1 ответ 1
Пример взят из http://kostin.ws/java/java-input-stream.html — первая же ссылка в гугле по вопросу "java scanner описание"
Всё ещё ищете ответ? Посмотрите другие вопросы с метками scanner или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.1.14.35771
Блог, посвященный программированию и сисадминистрированию
четверг, 7 июля 2011 г.
Как можно проверить является ли строка числом на java?
Этот вопрос возникает наверное у каждого начинающего (и не очень) программиста на java. Есть несколько способов выполнить вышеописанную задачу.
Способ первый — использование метода Integer.parseInt(String string).
Этот способ очень быстро выполняется если строка является числом (в 5-10 раз быстрее, чем способ с использованием регулярных выражений), и очень долго — если строка числом не является (примерно в 1,5 раз дольше, чем способ с использованием регулярных выражений).
Способ второй — использование регулярных выражений.
Этот метод выполняется примерно с одинаковой скоростью вне зависимости от того является ли строка числом.
Способ третий — проверка по очереди каждого символа в строке.
При тестировании данный метод показал на удивление хорошие результаты — более чем в 3 раза быстрее, чем самый быстрый случай для первого и второго метода.
Третий метод и второй для преобрахования строк не подходят, в отличие от первого (при небольшой доработке).
Поэтому если задача стоит только в определении является ли строка числом — то лучше всего подойдет именно третий метод, если же помимо прочего ещё и необходимо преобразовать строку в число то лучше воспользоваться 1 методом, немного видоизменив его.