0
0

.next()と.nextLine()の違いと、初心者向けのScannerの解説

Posted at

色々なサイトで説明されていますがイマイチ核心を掴めていない両者の違いを自分なりに確認していきます。
まずは、両者のメソッドを確認。

.next()とは

 Scannerで取得した値を文字列として受け取る。受け取る範囲は空白まで。
例:「aaaa bbbb ccccc」と入力された場合は「aaaa」のみ取得される。

.nextLine()とは

 Scannerで取得した値を文字列として受け取る。受け取る範囲は改行まで。
例:「aaaa bbbb ccccc」と入力された場合は「aaaa bbbb ccccc」まで取得される。

実際のコードと出力結果の例

▼コード

import java.util.Scanner;

public class ScannerNextMethod {
  public static void main(String[] args) {
    Scanner scNext = new Scanner(System.in);
    String a = scNext.next();
    System.out.println(a);

    Scanner scNextLine = new Scanner(System.in);
    String b = scNextLine.nextLine();
    System.out.println(b);

    scNext.close();
    scNextLine.close();
  }
}

▼出力結果

aaaa bbbb cccc
aaaa
aaaa bbbb cccc
aaaa bbbb cccc

想定通り、next();のときは空白までの「aaaa」のみ、nextLine();のときは改行までの「aaaa bbbb cccc」全てが出力されています。
※ちなみに、「scNext.close();」「scNextLine.close();」を最後に書いていますが、こちらはどちらか1つのみでOKです。今回はVSCodeの「Scannerが閉じられていません」の警告を回避するために念の為、両方とも記載しています。(黃波線が気になるので…)

実際にコードを動かしてみると、両者の違いについて明確に確認できますね!

詳細説明

では、上記のコードがどういう流れで進んでいるのか確認していきます。

import java.util.Scanner;

こちらはScannerクラスを使うときの決まりですね。Scannerに限らず、java.langパッケージ以外のクラスを使用するときは、適切なものをimportして使う必要があります。

 Scanner scNext = new Scanner(System.in);

この1文で下記の処理が行われています。

  1. Scanner型の変数scNextを宣言
  2. ユーザーが入力したものを全てスキャン(読み取り)
  3. スキャンしたものを全て変数に入れる(※ 正確な動作は少し違いますが、この認識でも大丈夫かと思います)

上記コードの場合、scNextには「aaaa bbbb cccc」が入ります。

String a = scNext.next();
  1. String型の変数aを宣言
  2. scNextに入れた要素を、指定の区切り文字(next();のときは空白、nextLine();のときは改行)で分割して変数aに入れる

上記コードの場合
「変数a」には「aaaa(1つの要素)」が
「変数b」には「aaaa bbbb cccc(ここまでで1つの要素)」が入ります。

System.out.println(a);

変数aを画面に出力して結果を得ます。

next();とnextLine();を混合で使ってみる

サンプルのコードを以下のように書き換えて、両者のコードについてさらに理解を深めていきたいと思います。
なお、コメントアウトしている部分(//で始める行)については、一旦無視してください。
▼コード

import java.util.Scanner;

public class ScannerNextMethod {
  public static void main(String[] args) {
    Scanner scNext = new Scanner(System.in);
    String a = scNext.next();
    String c = scNext.next();
    String d = scNext.nextLine();

    System.out.println("a:" + a);
    System.out.println("c:" + c);
    System.out.println("d:" + d);

    Scanner scNextLine = new Scanner(System.in);
    String b = scNextLine.nextLine();
    // String e = scNextLine.next();
    System.out.println("b:" + b);
    // System.out.println("e:" + e);

    scNext.close();
    scNextLine.close();
  }
}

▼出力結果
aaaa bbbb cccc
a:aaaa
c:bbbb
d: cccc
aaaa bbbb cccc
aaaa bbbb
b:aaaa bbbb cccc

説明

不要かもしれませんが、念のため解説をします。

 Scanner scNext = new Scanner(System.in);

入力された内容を全てスキャンして、変数scNextへ入れます。

String a = scNext.next();

空白までの1つの要素を、変数aへ入れます。

String c = scNext.next();

空白までの1つの要素を、変数cへ入れます。

String d = scNext.nextLine();

改行までの1つの要素を、変数dへ入れます。変数cまでで、「bbbb」が参照済みのため、「bbbb」の後ろの半角スペースから改行までの要素が全て入ります。

終わり

長くなってきたので、今回は以上とさせていただきます!
コメントアウトしている部分の動きについては次回、確認していきます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0