Проверка входа с помощью java.util. Сканер [дубликат]

39
задан skaffman 8 May 2011 в 09:52
поделиться

3 ответа

Если вы анализируете строковые данные с консоли или аналогичного средства, лучший способ - использовать регулярные выражения. Подробнее об этом читайте здесь: http://java.sun.com/developer/technicalArticles/releases/1.4regex/

В противном случае, чтобы разобрать int из строки, попробуйте Integer.parseInt (строка) . Если строка не является числом, вы получите исключение. В противном случае вы можете проверить это значение, чтобы убедиться, что оно не отрицательное.

String input;
int number;
try
{
    number = Integer.parseInt(input);
    if(number > 0)
    {
        System.out.println("You positive number is " + number);
    }
} catch (NumberFormatException ex)
{
     System.out.println("That is not a positive number!");
}

Чтобы получить строку, состоящую только из символов, вам, вероятно, лучше было бы перебирать каждый символ в цикле, проверяя наличие цифр, используя, например, Character.isLetter (char) .

String input
for(int i = 0; i<input.length(); i++)
{
   if(!Character.isLetter(input.charAt(i)))
   {
      System.out.println("This string does not contain only letters!");
      break;
   }
}

Удачи!

0
ответ дан 27 November 2019 в 02:03
поделиться

Одна идея:

try {
    int i = Integer.parseInt(myString);
    if (i < 0) {
        // Error, negative input
    }
} catch (NumberFormatException e) {
    // Error, not a number.
}

В библиотеке commons-lang также есть класс CharUtils , который предоставляет методы isAsciiNumeric () , чтобы проверить, что символ является числом, и isAsciiAlpha () , чтобы проверить, что символ является буквой ...

1
ответ дан 27 November 2019 в 02:03
поделиться

Обзор Scanner.hasNextXXX методов

java.util.Scanner имеет многие методы hasNextXXX , которые можно использовать для проверки ввода.Вот краткий обзор всех из них:

Сканер способен на большее, благодаря тому, что это регулярное выражение -на основании. Одной из важных функций является useDelimiter (String pattern) , которая позволяет вам определять, какой шаблон разделяет ваши токены. Существуют также методы find и skip , которые игнорируют разделители .

Следующее обсуждение сохранит регулярное выражение как можно более простым, поэтому основное внимание будет уделено Scanner .


Пример 1: Проверка положительных значений int

Вот простой пример использования hasNextInt () для проверки положительного int на входе.

Scanner sc = new Scanner(System.in);
int number;
do {
    System.out.println("Please enter a positive number!");
    while (!sc.hasNextInt()) {
        System.out.println("That's not a number!");
        sc.next(); // this is important!
    }
    number = sc.nextInt();
} while (number <= 0);
System.out.println("Thank you! Got " + number);

Вот пример сеанса:

Пожалуйста, введите положительное число!
пять
Это не число!
-3
Пожалуйста, введите положительное число!
5
Спасибо! Получено 5

Обратите внимание, насколько проще использовать Scanner.hasNextInt () по сравнению с более подробным try / catch Integer.parseInt / NumberFormatException комбо. По контракту сканер гарантирует , что если он hasNextInt () , то nextInt () мирно предоставит вам int , и не вызовет какое-либо NumberFormatException / InputMismatchException / NoSuchElementException .

Связанные вопросы


Пример 2: Несколько hasNextXXX на одном токене

Обратите внимание, что приведенный выше фрагмент содержит инструкцию sc.next () для продвижения сканера , пока не будет hasNextInt () . Важно понимать, что ни один из hasNextXXX методов не продвигает Scanner мимо любого ввода! Вы обнаружите, что если вы опустите эту строку из сниппета, это приведет к бесконечному циклу при недопустимом вводе!

Это имеет два последствия:

  • Если вам нужно пропустить ввод «мусора», который не прошел тест hasNextXXX , то вам нужно продвинуть Scanner так или иначе (например next () , nextLine () , пропустить и т. Д.).
  • Если один тест hasNextXXX не прошел, вы можете по-прежнему проверить, возможно, он hasNextYYY !

Вот пример выполнения нескольких тестов hasNextXXX .

Scanner sc = new Scanner(System.in);
while (!sc.hasNext("exit")) {
    System.out.println(
        sc.hasNextInt() ? "(int) " + sc.nextInt() :
        sc.hasNextLong() ? "(long) " + sc.nextLong() :  
        sc.hasNextDouble() ? "(double) " + sc.nextDouble() :
        sc.hasNextBoolean() ? "(boolean) " + sc.nextBoolean() :
        "(String) " + sc.next()
    );
}

Вот пример сеанса:

5
(int) 5
false
(логическое) false
blah
(String) blah
1.1
(double ) 1.1
100000000000
(длинный) 100000000000
exit

Обратите внимание, что порядок тестов имеет значение. Если сканер hasNextInt () , то он также hasNextLong () , но он не обязательно истинный наоборот. Чаще всего вы захотите провести более конкретный тест перед более общим.


Пример 3: Проверка гласных

Сканер имеет множество дополнительных функций, поддерживаемых регулярными выражениями. Вот пример его использования для проверки гласных.

Scanner sc = new Scanner(System.in);
System.out.println("Please enter a vowel, lowercase!");
while (!sc.hasNext("[aeiou]")) {
    System.out.println("That's not a vowel!");
    sc.next();
}
String vowel = sc.next();
System.out.println("Thank you! Got " + vowel);

Вот пример сеанса:

Пожалуйста, введите гласную,строчные!
5
Это не гласная!
z
Это не гласная!
e
Спасибо! Got e

В регулярном выражении в виде строкового литерала Java шаблон «[aeiou]» - это то, что называется «классом символов»; он соответствует любой из букв a , e , i , o , u . Обратите внимание, что сделать вышеуказанный тест нечувствительным к регистру просто тривиально: просто предоставьте такой шаблон регулярного выражения сканеру .

API-ссылки

Связанные вопросы

Ссылки


Пример 4: Использование двух сканеров одновременно

Иногда вам нужно сканировать построчно, с несколькими маркерами в строке. Самый простой способ сделать это - использовать два сканера , где второй сканер берет nextLine () из первого сканера в качестве входных данных. Вот пример:

Scanner sc = new Scanner(System.in);
System.out.println("Give me a bunch of numbers in a line (or 'exit')");
while (!sc.hasNext("exit")) {
    Scanner lineSc = new Scanner(sc.nextLine());
    int sum = 0;
    while (lineSc.hasNextInt()) {
        sum += lineSc.nextInt();
    }
    System.out.println("Sum is " + sum);
}

Вот пример сеанса:

Дайте мне несколько цифр в строке (или «выйти»)
3 4 5
Сумма 12
10 100 за миллион долларов
Сумма равна 110
что подождите?
Сумма равна 0
exit

В дополнение к конструктору Scanner (String) , есть также Scanner (java.io .File) среди других.


Резюме

  • Сканер предоставляет богатый набор функций, таких как методы hasNextXXX для проверки.
  • Правильное использование комбинации hasNextXXX / nextXXX означает, что Сканер НИКОГДА не будет генерировать исключение InputMismatchException / NoSuchElementException .
  • Всегда помните, что hasNextXXX не продвигает Сканер за пределы любого ввода.
  • Не стесняйтесь при необходимости создать несколько сканеров . Два простых сканера часто лучше, чем один слишком сложный сканер .
  • Наконец, даже если вы не планируете использовать расширенные функции регулярных выражений, помните, какие методы основаны на регулярных выражениях, а какие нет. Любой метод сканера , который принимает аргумент String pattern , основан на регулярных выражениях.
    • Совет : простой способ превратить любую String в буквальный шаблон - это Pattern.quote it.
138
ответ дан 27 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: