System.in
を使用してユーザー入力を取得していjava.util.Scanner
ます。次のような入力を検証する必要があります。
- 負でない数値である必要があります
- アルファベットである必要があります
- ...など
これを行う最善の方法は何ですか?
System.in
を使用してユーザー入力を取得していjava.util.Scanner
ます。次のような入力を検証する必要があります。
これを行う最善の方法は何ですか?
Scanner.hasNextXXX
メソッドの概要java.util.Scanner
hasNextXXX
入力を検証するために使用できる多くのメソッドがあります。それらすべての簡単な概要は次のとおりです。
hasNext()
-トークンはまったくありますか?hasNextLine()
- 別の入力行がありますか?hasNextInt()
- に解析できるトークンがありint
ますか?hasNextDouble()
、hasNextFloat()
、hasNextByte()
、hasNextShort()
、hasNextLong()
、も利用可能hasNextBoolean()
hasNextBigInteger()
、hasNextBigDecimal()
Scanner
正規表現ベースであるため、より多くのことが可能です。重要な機能の 1 つは、トークンを区切るパターンuseDelimiter(String pattern)
を定義できる です。区切り文字を無視するメソッドもあります。find
skip
次の説明では、正規表現をできるだけ単純にするため、焦点は引き続き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.parseInt
NumberFormatException
Scanner
hasNextInt()
nextInt()
int
NumberFormatException
InputMismatchException
NoSuchElementException
hasNextXXX
同じトークンに複数上記のスニペットには、 until itsc.next()
を進めるステートメントが含まれていることに注意してください。過去の入力を進めるメソッドはないことを理解することが重要です! スニペットからこの行を省略すると、無効な入力で無限ループに入ることがわかります!Scanner
hasNextInt()
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.Pattern
Scanner
を同時に使用する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)
あります。
Scanner
hasNextXXX
検証メソッドなど、豊富な機能セットを提供します。hasNextXXX/nextXXX
を組み合わせて適切に使用すると、 aScanner
は決してInputMismatchException
/をスローしませんNoSuchElementException
。hasNextXXX
を進めないことを常に覚えておいてください。Scanner
Scanner
。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;
}
}
幸運を!