💬

Scanner.nextXXX(): キーボードからの入力値を取得する

2022/03/01に公開

Scanner.nextXXX(): キーボードからの入力値を取得する

PaizaではScannerクラスを使って入力値を取り込む必要がある。
その中で外せないのが、nextXXX()系のメソッドだ。

今のところ、よく出てくるのが、以下の3つ。

  • nextLine()
  • next()
  • nextInt()

使い分けがいまいちよく分からないというか、勘で行っている部分が多いので、まとめてみた。
最低限頭に入れておけばいいのは、next()nextInt()が読み込む範囲は、次のスペース、タブ、改行記号まで。nextLine()は次の改行記号までを読み込むということだと思う。

メソッド 取得するもの 読み込み後のカーソルの位置 その他
nextLine() 現在の行の残り(次の改行記号まで読み込む) 次の行 行が空でも読み込む。スペースが入っていても読み込み可
next() 次の要素[1]を取得(次のスペース/tab/改行記号までを読み込む) 同じ行の可能性も -
nextInt() 次の要素[1:1]int[2]として取得(次のスペース/tab/改行記号までを読み込む) 同じ行の可能性も 次の要素がintに変換できない場合はエラーを返す

https://www.geeksforgeeks.org/difference-between-next-and-nextline-methods-in-java/

https://stackoverflow.com/questions/32798803/understanding-scanners-nextline-next-and-nextint-methods

Example.java

public class Example {  

	static String test1 =  
		"3 5 6 7 8";  

	static String test2 =  
		"FCrj 7A7SbR9i S Pza OXvPpkqNf2";  

	static String test3 =  
		"FC rj\n7A7  SbR9i\n S\nPza\nOXvPpkqNf2";  

	public static void main(String[] args) {  

		Scanner sc1 = new Scanner(test1);  
		int[] ary = new int[5];  
		for(int i = 0; i < 5; i++)
			ary[i] = sc1.nextInt();  
		sc1.close();  

		Scanner sc2 = new Scanner(test2);  
		String[] arystr2 = new String[5];  
		for(int j = 0; j < 5; j++) 
			arystr2[j] = sc2.next();  
		sc2.close();  

		Scanner sc3 = new Scanner(test3);  
		String[] arystr3 = new String[5];  
		for(int k = 0; k < 5; k++)
			arystr3[k] = sc3.next();  
		 
		sc3.close();  

		Scanner sc4 = new Scanner(test3);  
		String[] arystr4 = new String[5];  
		for(int k = 0; k < 5; k++)
			arystr4[k] = sc4.nextLine();  
		sc3.close();  

		System.out.println(Arrays.toString(ary));  
		System.out.println(Arrays.toString(arystr2));  
		System.out.println(Arrays.toString(arystr3));  
		System.out.println(Arrays.toString(arystr4));  
	}
}

出力結果

[3, 5, 6, 7, 8]
[FCrj, 7A7SbR9i, S, Pza, OXvPpkqNf2]
[FC, rj, 7A7, SbR9i, S]
[FC rj, 7A7  SbR9i,  S, Pza, OXvPpkqNf2]

複雑な入力値に対しての対処法

next().split(" "): 文字列から二次元配列を作る

想定しているのは、以下のインプットを二次元配列に変換すること。

input:
XXOXO  
OXOXX  
OOOOO  
OXOX.  
XOXXO

output:
[[X, X, O, X, O], [O, X, O, X, X], [O, O, O, O, O], [O, X, O, X, .], [X, O, X, X, O]]

static String test1 =  
      "XXOXO \n" +  
      "OXOXX \n" +  
      "OOOOO \n" +  
      "OXOX. \n" +  
      "XOXXO";

public static void main(String[] args) {
	
	Scanner sc = new Scanner(test1);  
	String board[][] = new String[5][5];  

	// Create 2D-array, board  
	for (int i = 0; i < 5; i++) {  
	   board[i] = sc.next().split("");  
	}  
	System.out.println(Arrays.deepToString(board));
	
}

  • board[i] = sc.next().split("");
    • sc.next()で得られるのは文字列
      • 例:"XXOXO"
    • この文字列に対して`.split("")で、文字列を配列に変換
      • 例:[X, X, O, X, O]
  • 以上の処理を、列の数だけ繰り返している。
脚注
  1. 厳密には次の'token'を取得する。これは、空白(スペース、tab, 改行)を含まないString要素のこと。link ↩︎ ↩︎

  2. Stringint以外の型で読み込みたい時は、それ専用のメソッドで読み込む必要がある。nextDouble()nextBoolean(), nextByte()など。いずれもプリミティブな型(Doubleでなくdoubleとして)値を取得する。 ↩︎

Discussion