System.inを使用してユーザー入力を取得していjava.util.Scannerます。次のような入力を検証する必要があります。
- 負でない数値である必要があります
- アルファベットである必要があります
- ...など
これを行う最善の方法は何ですか?
System.inを使用してユーザー入力を取得していjava.util.Scannerます。次のような入力を検証する必要があります。
これを行う最善の方法は何ですか?
Scanner.hasNextXXXメソッドの概要java.util.ScannerhasNextXXX入力を検証するために使用できる多くのメソッドがあります。それらすべての簡単な概要は次のとおりです。
hasNext()-トークンはまったくありますか?hasNextLine()- 別の入力行がありますか?hasNextInt()- に解析できるトークンがありintますか?hasNextDouble()、hasNextFloat()、hasNextByte()、hasNextShort()、hasNextLong()、も利用可能hasNextBoolean()hasNextBigInteger()、hasNextBigDecimal()Scanner正規表現ベースであるため、より多くのことが可能です。重要な機能の 1 つは、トークンを区切るパターンuseDelimiter(String pattern)を定義できる です。区切り文字を無視するメソッドもあります。findskip
次の説明では、正規表現をできるだけ単純にするため、焦点は引き続きScanner.
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
hasNextXXX同じトークンに複数上記のスニペットには、 until itsc.next()を進めるステートメントが含まれていることに注意してください。過去の入力を進めるメソッドはないことを理解することが重要です! スニペットからこの行を省略すると、無効な入力で無限ループに入ることがわかります!ScannerhasNextInt() hasNextXXX Scanner
これには 2 つの結果があります。
hasNextXXXで進める必要がありますScanner(例: next()、nextLine()、skipなど)。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その逆ではありません。多くの場合、より一般的なテストの前に、より具体的なテストを行いたいと思うでしょう。
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]"は「文字クラス」と呼ばれるものです。a、e、i、 、oのいずれかに一致しますu。上記のテストで大文字と小文字を区別しないようにするのは簡単なことであることに注意してください。そのような正規表現パターンをScanner.
hasNext(String pattern)true-次のトークンが、指定された文字列から構築されたパターンと一致するかどうかを返します。java.util.regex.PatternScannerを同時に使用する1 行に複数のトークンを使用して、1 行ずつスキャンする必要がある場合があります。これを実現する最も簡単な方法は、two Scannerを使用することです。ここで、2 番目ScannerはnextLine()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を進めないことを常に覚えておいてください。ScannerScanner。Scanner過度に複雑な 1 つよりも、単純な 2 つの方が優れていることがよくありScannerます。Scannerを取るメソッドString patternは正規表現ベースです。
String: anyをリテラル パターンに変換する簡単な方法は、それを使用するPattern.quoteことです。これを行うための最小限の方法を次に示します。
System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
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;
}
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()
コンソールなどから文字列データを解析する場合、最善の方法は正規表現を使用することです。詳細については、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;
}
}
幸運を!