東大ニート

東大卒のニートが勉強したことをメモするブログ

<Java> Scannerクラスの使い方(その1:基本編)

プログラミングコンテストをはじめようと思った時に、つまずきやすいのが入力処理。

私はJavaを使ってAtCoderの過去問をたまに解いていますが、入力で使用するScannerクラスについて書いておきます。(BufferedReaderクラスについてはFileReaderクラスの使い方BufferedReaderクラスの使い方で書いています。)

JavaDriveさんの以下の記事がわかりやすかったので、参考にさせていただきました。

www.javadrive.jp

 

まずは入力のイメージ

以下、AtCoderさんの練習用ページからの引用です。

まずは入力例から。 

入力

入力は以下の形式で与えられる。

a
b c
s
  • 1 行目は、整数 a (1≦a≦1,000) が与えられる。
  • 2 行目は、整数 b,c (1≦b,c≦1,000) が与えられる。
  • 3 行目は、文字列 s が与えられる。この文字列の長さは 1 文字以上 100 文字以下である。

入力例 1

1
2 3
test
はじめてのあっとこーだー(Welcome to AtCoder) - AtCoder

 

Javaコードの解答例

こちらもAtCoderさんの練習用ページからの引用です。

Java での解答例

  1. import java.util.*;
  2. public class Main {
  3.        public static void main(String[] args){
  4.               Scanner sc = new Scanner(System.in);
  5.               // 整数の入力
  6.               int a = sc.nextInt();
  7.               // スペース区切りの整数の入力
  8.               int b = sc.nextInt();
  9.               int c = sc.nextInt();
  10.               // 文字列の入力
  11.               String s = sc.next();
  12.               // 出力
  13.               System.out.println((a+b+c) + " " + s);
  14.        }
  15. }

 

はじめてのあっとこーだー(Welcome to AtCoder) - AtCoder

 となります。

 

ポイント1. Scannerクラスのimport(1行目)

Scannerクラスを簡単に使用するために、まずScannerクラスをimportします。importすることで、プログラム内でScannerクラスを使用する場合、「Scanner」と記載するだけで使えるようになります。importしない場合は、パッケージ名も含めて「java.util.Scanner」と記載しなければなりません。

Scannerクラスはjava.utilパッケージに含まれるので、「import java.util.Scanner;」と記述すれば大丈夫です。

もちろん解答例のように「import java.util.*;」と記述すれば、java.utilパッケージ内のクラスがすべてimportされるので、Scannerクラスもimportされることになります。

 

ポイント2. Scannerインスタンスの作成と標準入力(System.in)の読み込み(4行目)

まずはScannerインスタンスを作成し、標準入力の情報をScannerインスタンスに渡します。

新しくScannerインスタンス「sc」を作成する場合、「Scanner sc = new Scanner();」と記述すればよいです。scに渡す情報を、右辺の括弧の中に引数として入力します。

続いて標準入力ですが、Javaの場合、標準入力はSystemクラスのinフィールドから取得できるので、「System.in」をScannerインスタンスに渡すことで、入力情報が取得できます。
※私はフィールドの概念が怪しかったですが、各クラスはメソッド(機能)とフィールド(データ)を持ちます。標準入力はデータなのでフィールド。

以上をまとめると、System.inを引数として、Scannerインスタンス「sc」に情報を渡す場合は「Scanner sc = new Scanner(System.in);」と記述します。
これで、全入力情報がインスタンスscに渡されます。

 

 ポイント3. 区切り文字までの読み込み(5〜11行目)

最後に、全入力情報を持つscから、1つ1つの入力情報を取得します。

ここでは改行・スペースが区切り文字となる場合の取得方法を記載します。

文字列を取得する場合は「next」メソッド、整数を取得する場合は「nextInt」メソッドを使用します。

記述としては、「int a = sc.nextInt();」や「String s = sc.next();」のようになります。

 

これで入力された情報を取得することができました。

区切り文字の変更方法や、他の型の読み込み方についてはまた今度…。