51

System.inを使用してユーザー入力を取得していjava.util.Scannerます。次のような入力を検証する必要があります。

  • 負でない数値である必要があります
  • アルファベットである必要があります
  • ...など

これを行う最善の方法は何ですか?

4

6 に答える 6

154

Scanner.hasNextXXXメソッドの概要

java.util.ScannerhasNextXXX入力を検証するために使用できる多くのメソッドがあります。それらすべての簡単な概要は次のとおりです。

Scanner正規表現ベースであるため、より多くのことが可能です。重要な機能の 1 つは、トークンを区切るパターンuseDelimiter(String pattern)を定義できる です。区切り文字を無視するメソッドもあります。findskip

次の説明では、正規表現をできるだけ単純にするため、焦点は引き続き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);

セッションの例を次に示します。

正の数を入力してください。
5
数字じゃない!
-3
正の数を入力してください!
5
ありがとう!5を獲得

より冗長な/コンボScanner.hasNextInt()と比較して、どれだけ簡単に使用できるかに注意してください。契約により、 a は、それが の場合、平和的にそれを提供し、//をスローしないことを保証します。try/catch Integer.parseIntNumberFormatExceptionScanner hasNextInt()nextInt()intNumberFormatExceptionInputMismatchExceptionNoSuchElementException

関連する質問


例 2:hasNextXXX同じトークンに複数

上記のスニペットには、 until itsc.next()を進めるステートメントが含まれていることに注意してください。過去の入力を進めるメソッドないことを理解することが重要です! スニペットからこの行を省略すると、無効な入力で無限ループに入ることがわかります!ScannerhasNextInt() hasNextXXX Scanner

これには 2 つの結果があります。

  • テストに失敗した「ガベージ」入力をスキップする必要がある場合は、何らかの方法hasNextXXXで進める必要がありますScanner(例: next()nextLine()skipなど)。
  • 1 つの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
(boolean) false
blah
(String) blah
1.1
(double) 1.1
100000000000
(long) 100000000000
exit

テストの順序が重要であることに注意してください。の場合、Scanner hasNextInt()それもhasNextLong()ですが、必ずしもtrueその逆ではありません。多くの場合、より一般的なテストの前に、より具体的なテストを行いたいと思うでしょう。


例 3 : 母音の検証

Scannerには、正規表現によってサポートされる多くの高度な機能があります。これを使用して母音を検証する例を次に示します。

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
それは母音ではありません!
ありがとう
ございます!手に入れた

正規表現では、Java 文字列リテラルとして、パターン"[aeiou]"は「文字クラス」と呼ばれるものです。aei、 、oのいずれかに一致しますu。上記のテストで大文字と小文字を区別しないようにするのは簡単なことであることに注意してください。そのような正規表現パターンをScanner.

API リンク

関連する質問

参考文献


例 4: 2 つScannerを同時に使用する

1 行に複数のトークンを使用して、1 行ずつスキャンする必要がある場合があります。これを実現する最も簡単な方法は、two Scannerを使用することです。ここで、2 番目ScannernextLine()1 番目からScannerを入力として受け取ります。次に例を示します。

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);
}

セッションの例を次に示します。

たくさんの数字を 1 行に並べてください (または「終了」)
3 4 5
合計は 12
10 100 100 万ドル
合計は 110
え?
合計は 0
出口

Scanner(String)コンストラクタに加えて、他にもScanner(java.io.File)あります。


概要

  • ScannerhasNextXXX検証メソッドなど、豊富な機能セットを提供します。
  • hasNextXXX/nextXXXを組み合わせて適切に使用すると、 aScanner決してInputMismatchException/をスローしませんNoSuchElementException
  • 過去の入力hasNextXXXを進めないことを常に覚えておいてください。Scanner
  • 必要に応じて、恥ずかしがらずに複数作成してくださいScannerScanner過度に複雑な 1 つよりも、単純な 2 つの方が優れていることがよくありScannerます。
  • 最後に、高度な正規表現機能を使用する予定がない場合でも、正規表現ベースのメソッドとそうでないメソッドに注意してください。引数Scannerを取るメソッドString patternは正規表現ベースです。
    • ヒントString: anyをリテラル パターンに変換する簡単な方法は、それを使用するPattern.quoteことです。
于 2010-06-17T06:27:24.043 に答える
8

これを行うための最小限の方法を次に示します。

System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
于 2014-05-23T23:46:43.080 に答える
3

Strings の文字をチェックするには、次のような正規表現を使用できます。

someString.matches("[A-F]");

数値をチェックしてプログラムのクラッシュを止めるために、必要な値の範囲を定義できる非常に単純なクラスを以下に示します。 ここ

    public int readInt(String prompt, int min, int max)
    {
    Scanner scan = new Scanner(System.in);

    int number = 0;

    //Run once and loop until the input is within the specified range.
    do 
    {
        //Print users message.
        System.out.printf("\n%s > ", prompt);

        //Prevent string input crashing the program.
        while (!scan.hasNextInt()) 
        {
            System.out.printf("Input doesn't match specifications. Try again.");
            System.out.printf("\n%s > ", prompt);
            scan.next(); 
        }

        //Set the number.
        number = scan.nextInt();

        //If the number is outside range print an error message.
        if (number < min || number > max)
            System.out.printf("Input doesn't match specifications. Try again.");

    } while (number < min || number > max);

    return number;
}
于 2012-12-02T13:48:40.477 に答える
1

1 つのアイデア:

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

また、commons-langライブラリには、文字が数字であることを確認し、文字が文字であることを確認するメソッドを提供するCharUtilsクラスがあります...isAsciiNumeric()isAsciiAlpha()

于 2010-06-17T06:30:17.170 に答える
0

コンソールなどから文字列データを解析する場合、最善の方法は正規表現を使用することです。詳細については、http: //java.sun.com/developer/technicalArticles/releases/1.4regex/を参照してください。

それ以外の場合、文字列から int を解析するには、 Integer.parseInt(string)を試してください。文字列が数値でない場合、例外が発生します。それ以外の場合は、その値に対してチェックを実行して、負でないことを確認できます。

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;
   }
}

幸運を!

于 2010-06-17T06:28:24.747 に答える