{Java} paizaでの標準入力の受け取り方
paizaで与えられる文字列をどうやって使えばいいかわからん人用。
この記事の目次
・基本的な受け取り方
・複数行入力される時
・スペース区切りで入力される時
基本的な受け取り方
Scanner sc = new Scanner(System.in); String line = sc.nextLine(); System.out.println("XXXXXX");
とりあえず言語でJavaを選んだらこんなコードが出てくる。
この sc.nextLine() が標準入力を受け取る合図みたいなもの。
(詳しくは省略するけど、Scannerをscで初期化してるので、sc.nextLine()になってるぐらいに思っといて)
仮に標準入力で与えられるのが "hoge" だった場合、
String x = sc.nextLine(); // xに"hoge"が代入される System.out.println(x); // "hoge"
となる。終わり。
複数行入力されるとき。
問題によって入力が複数回行われる時がある。
入力される値
入力は以下のフォーマットで与えられます。
c_1
c_2
入力は 2 行となり末尾に改行が入ります。
一例としてはこんな感じで書かれていることが多い。
これは単純に1回目のsc.nextLine()では1行目
2回目のsc.nextLine()では2行目が受け取られる
仮に2行入力され、1行目が"one"、2行目が"two"だった場合、
String x = sc.nextLine(); // xに"one"が代入される String y = sc.nextLine(); // yに"two"が代入される System.out.println(x); // "one" System.out.println(y); // "two"
となる。要は入力される回数だけreadLine()!を繰り返せばいい。
つまり3回入力されるなら
String[] strs = new String[3]; // 標準入力を受け取る用の空の配列を定義 for (int i = 0; i < 3; i++) { // 3回ループさせ、 strs[i] = sc.nextLine(); // i番目に1つづつ受け取っていく }
て感じでループ内で取得して配列に格納することもできる。
ただ受け取る入力がそれぞれ違った種類の情報のときは
String time = sc.nextLine(); // 15 String place = sc.nextLine(); // "cafe" String occasion = sc.nextLine(); // "hungry"
と、一つずつ変数に入れるべきだと思う。
スペース区切りで入力されるとき。
一行で値を複数入力してくる問題もある。
入力される値
入力は以下のフォーマットで与えられます。
c_1 h_1
1 行目には文字列Aと文字列Bが半角スペース区切りで与えられます。
こんな感じで。 仮に"Tanaka" "Suzuki"の二つの文字列が与えられる場合、
String x = sc.nextLine(); // xに"Tanaka Suzuki"が代入される System.out.println(x); // "Tanaka Suzuki"
となる。単純に1つの文字列として入力されるが、大抵"Tanaka"と"Suzuki"は別々に使いたいと思う。そんな時は
String[] strArray = sc.nextLine().split(" "); // " "がある所で区切って格納する System.out.println(strArray[0]); // "Tanaka" System.out.println(strArray[1]); // "Suzuki"
sc.nextLine();の後に .split(" ") を足せば解決できる。
カッコ内に " " のように半角スペースを指定すれば、半角スペースをその区切りとして認識して、区切りごとに配列の要素として順に格納される。
ただ大抵扱うのは数値なので、初めからint型にキャストしてやりたい。
int[] intArray = Arrays.stream(sc.nextLine().split(" ")) //" "で区切ってString配列へ .mapToInt(Integer::parseInt) //数値にして .toArray(); //配列へ
String型で受け取っておいてintに変換してもいいけど、確実に数値が入ってくるなら、受け取る→配列型にする→型変換するを一気にやっちゃえる。
※わかりやすいように行を分けてるけど、一行で書けるからね。