こんにちは!今日のレッスンは特別です!これまでは、問題を解決してプログラムを作成するときのアルゴリズムは単純でした。コードを作成し、main()メソッドを実行すると、プログラムは必要な処理を行って終了します。しかし今、すべてが変わります!今日、私たちはプログラムと実際に対話する方法を学びます。私たちのアクションに反応するようにプログラムを教えます。私たちがこの問題で何をしようとしているのかはすでに理解されているかもしれません。この講義では、Java 言語クラスの 1 つであるスキャナーの詳細な分析に専念します。このクラスは、ユーザーが入力したデータを読み取る必要がある場合に役立ちます。コードの学習に進む前に、スキャナーのようなデバイスに出会ったことがありますか? 確かにそうです。スキャナの内部構造は非常に複雑ですが、その動作の本質は非常に単純です。スキャナは、ユーザーが入力したデータ (パスポートや保険証書など) を読み取り、読み取った情報をメモリに保存します (たとえば、 、画像の形で)。そこで、今日は独自のスキャナーを作成します。もちろん、彼は文書を扱うことはできませんが、テキスト情報をかなり上手に扱うことができます:) さあ、行きましょう!
Java スキャナ クラス
最初に理解する必要がある最も重要なことは、クラスですjava.util.Scanner
。その機能は非常にシンプルです。実際のスキャナーと同様に、指定したソースからデータを読み取ります。たとえば、行から、ファイルから、コンソールからなどです。次に、この情報を認識し、必要に応じて処理します。最も単純な例を挙げてみましょう。
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner("I love you, Petra creation,\n" +
"I love your stern, slim look,\n" +
"Neva sovereign current,\n" +
"Coastal granite");
String s = scanner.nextLine();
System.out.println(s);
}
}
スキャナー オブジェクトを作成し、そのデータ ソース (テキストを含む文字列) を指定しました。このメソッドはnextLine()
データ ソース (四行列を含むテキスト) にアクセスし、まだ読み取っていない次の行 (この場合は最初の行) を見つけて、それを返します。その後、それをコンソールに出力します。 コンソール出力:
Люблю тебя, Peterа творенье,
このメソッドをnextLine()
数回使用して、詩全体を出力できます。
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner("I love you, Petra creation,\n" +
"I love your stern, slim look,\n" +
"Neva sovereign current,\n" +
"Coastal granite");
String s = scanner.nextLine();
System.out.println(s);
s = scanner.nextLine();
System.out.println(s);
s = scanner.nextLine();
System.out.println(s);
s = scanner.nextLine();
System.out.println(s);
}
}
そのたびに、スキャナは 1 歩進み、次の行を読み取ります。プログラムの結果がコンソールに出力されます。
Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
すでに述べたように、スキャナーのデータ ソースは文字列だけでなく、たとえばコンソールにすることもできます。私たちにとって重要なお知らせです。以前はそこにデータを出力するだけでしたが、これからはキーボードからデータを入力します。Scannerクラスで他に何ができるかを見てみましょう。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number:");
int number = sc.nextInt();
System.out.println("Thank you! You entered a number" + number);
}
}
このメソッドは、nextInt()
入力された数値を読み取り、返します。私たちのプログラムでは、変数に値を割り当てるために使用されますnumber
。これは本物のスキャナーに似ています。プログラムはユーザーに、行に任意の数値を入力するよう求めます。ユーザーがこれを完了すると、プログラムはユーザーに感謝し、作業の結果をコンソールに表示して終了します。しかし、私たちにはまだ重大な問題が 1 つあります。ユーザーが間違えて間違った内容を入力する可能性があります。 現在のプログラムが動作しなくなる例を次に示します。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number:");
int number = sc.nextInt();
System.out.println("Thank you! You entered a number" + number);
}
}
数値の代わりに文字列「JavaRush」を入力してみましょう。 コンソール出力:
Enter the number:
JavaRush
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Main.main(Main.java:10)
Process finished with exit code 1
おっと、すべてがダメです -_- このような状況を回避するには、ユーザーが入力したデータを検証する方法を考え出す必要があります。たとえば、ユーザーが数字以外のものを入力した場合、入力された情報が数字ではないという警告をコンソールに表示し、すべてが正しい場合は確認テキストを表示するとよいでしょう。しかし、これを行うには、実際には「未来を見据える」必要があります。つまり、フローの次に何が起こるかを見つけ出す必要があります。Java のスキャナーはこれを行うことができますか? なんと彼は!そして、このために、メソッドのグループ全体があります。 hasNextInt()
- このメソッドは、入力されたデータの次の部分が数値かどうかをチェックします (それぞれ true または false を返します)。 hasNextLine()
— 次のデータが文字列かどうかを確認します。 hasNextByte()
、、、、、-これらすべてのメソッドはhasNextShort()
、他のデータ型に対してhasNextLong()
も同じことを行います。数値を読み取るようにプログラムを変更してみましょう。 hasNextFloat()
hasNextDouble()
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number:");
if (sc.hasNextInt()) {
int number = sc.nextInt();
System.out.println("Thank you! You entered a number" + number);
} else {
System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
}
}
}
ここで、プログラムは入力された次の文字が数字かどうかをチェックします。正しい場合にのみ、確認が表示されます。入力がテストに合格しない場合、プログラムはこれを認識し、再試行するように求めます。基本的に、Scanner オブジェクトと通信し、予期されるデータの種類を事前に知ることができます。「ねえ、スキャナー、次は何をするの?数値、文字列、またはその他何か? 番号?で、どっちが―― 、、、int
?」この柔軟性により、ユーザーの動作に応じてプログラムのロジックを構築する機会が得られます。注目に値するもう 1 つの重要な方法は です。このメソッドには、区切り文字として使用する文字列が渡されます。たとえば、私たちは突然日本の詩に興味を持ち、スキャナーを使用して偉大な詩人、松尾芭蕉のいくつかの俳句を読むことにしました。たとえ 3 つの異なる詩がぎこちない 1 行で与えられたとしても、それらを簡単に分離して適切にフォーマットすることができます。 short
long
useDelimiter()
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner("On a Bare Branch" +
"Raven sits alone.'" +
"Autumn evening." +
"''***''" +
"There's such a moon in the sky,'" +
"Like a tree cut down at the root:'" +
"A fresh cut turns white." +
"''***''" +
"How the river has overflowed!" +
"The heron wanders on short legs,'" +
"Knee-deep in water.");
scan.useDelimiter("'");
while (scan.hasNext()) {
System.out.println(scan.next());
}
scan.close();
}
}
ScannerクラスのuseDelimeter()メソッド を行区切りとして使用します。これは、受信データを複数の部分に分割する役割を果たします。この例では、一重引用符 ( "'" )が引数として渡され、文字列を区切るために使用されます。while ループではSystemクラスのprintln()メソッドを使用してデータを読み取るため、この引用符に続くテキストは新しい行に表示されます。その結果、本と同じように、コンソールに美しい出力が表示されます。
На голой ветке
Ворон сидит одиноко.
Осенний вечер.
***
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.
***
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
同じ例で、必ず注意を払う必要があるメソッドがもう 1 つありますclose()
。I/O ストリームを処理する他のオブジェクトと同様に、スキャナはコンピュータのリソースを消費しないように、作業が完了したら閉じる必要があります。 方法を決して忘れないでくださいclose()
!
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number:");
int number = sc.nextInt();
System.out.println("Thank you! You entered a number" + number);
sc.close();//Now we did everything right!
}
}
それだけです!ご覧のとおり、Scanner クラスは非常に使いやすく、非常に便利です。:)
GO TO FULL VERSION