Javaで標準入力を受け取る(paizaのカンペ)
(2020/10/10 追記:複数行のスペース区切りの文字列・数字の受け取り方を追加しました)
(2020/11/3 追記:一行目が数字・二行目以降が文字列の入力の受け取り方と、地図の受け取り方を追加しました)
Javaでの標準入力が難しいと思ったので自分用のメモです。
一行の単語を受け取る
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//Scannerクラスのインスタンスscを作成
String line = sc.next();//Scannerクラスのメソッドnext()を使って、lineに単語を格納する
System.out.println(line);//lineを出力する
}
}
「paiza Java」のようにスペースで単語が区切られている時に、スペースで区切られた最初の単語(この例ではpaiza)を取得できます。単語を格納する変数lineの型をStringと宣言することを忘れないように!
一行の数字を受け取る
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//Scannerクラスのインスタンスscを作成
int line = sc.nextInt();//ScannerクラスのメソッドnextInt()を使って、lineに数字を格納する
System.out.println(line);//lineを出力する
}
}
「123 456」のようにスペースで数字が区切られている時に、スペースで区切られた最初の数字(この例では123)を取得できます。
一行のスペースで区切られた文字列を配列で受け取る
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//Scannerクラスのインスタンスscを作成
String[] words = sc.nextLine().split(" ");
//nextLine()メソッドでスペースを含めて一行取得。取得した一行をsplit(" ")で空白区切りにし、配列wordsに格納
System.out.println(words[0]);//wordsのインデックス0を出力
System.out.println(words[1]);//wordsのインデックス1を出力
}
}
split()の引数を”,”に変更すれば、カンマ区切りの入力を配列に格納できます。
一行のスペースで区切られた数字を配列で受け取る
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//Scannerクラスのインスタンスscを作成
int[] numbers = new int[2];//int型の要素を代入する配列numbersを用意
//forループを回して、nextInt()でスペースの直前の数字をnumbersに代入していく
for(int i=0; i<numbers.length; i++){
numbers[i]=sc.nextInt();
}
System.out.println(numbers[0]);//numbersのインデックス0を出力
System.out.println(numbers[1]);//numbersのインデックス1を出力
}
}
もっとスマートな受け取り方があるかもしれないです。アドバイス求む!
複数行の文字列を配列で受け取る
何行の文字列が与えられるか分かっている場合
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();//与えられる文字列の行数を取得する
String[] enemies=new String[count];//String型の要素を代入する配列enemiesを用意
//与えられる文字列の行数の数だけループして、enemiesに代入していく
for (int i=0; i < count; i++) {
enemies[i]=sc.next();
}
//出力
for(int i=0;i<enemies.length; i++){
System.out.println(enemies[i]);
}
}
}
何行の文字列が与えられるか分からない場合
*paizaの問題では稀なケースだと思います。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<String> words = new ArrayList<String>();//String型のデータを格納するArrayList wordsを作成
while (sc.hasNextLine()) {
String word = sc.next();//一行の単語を受け取る
words.add(word);//ArrayListのwordsに受け取った単語を格納する
}
for(String word :words) {
System.out.println(word);
}
}
}
複数行の数字を配列で受け取る
何行の数字が与えられるか分かっている場合
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();//一行目の行数に関する数字を取得
int[] numbers = new int[count];//行数の数だけ要素を持つ配列numbersを用意
//forループでnumbersのi番目の要素に数字を代入
for (int i = 0; i < numbers.length; i++) {
numbers[i]=sc.nextInt();
}
//出力
for(int i = 0; i<numbers.length; i++){
System.out.println(numbers[i]);
}
}
}
何行の数字が与えられるか分からない場合
*paizaの問題では稀なケースだと思います。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Integer> numbers = new ArrayList<Integer>();//int型のデータを格納するArrayList numbersを作成
while (sc.hasNextLine()) {
int number = sc.nextInt();//一行の数字を受け取る
numbers.add(number);//ArrayListのnumbersに受け取った数字を代入する
}
//出力する
for(int number : numbers) {
System.out.println(number);
}
}
}
複数行のスペース区切りの文字列を受け取る
行数がn行、一行あたりの単語(/文字列)の数がm個で「n m」と半角スペース区切りの一行で与えられているとします。余談ですが、mの数は2個が多い気がします。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//行数を取得する
int m = sc.nextInt();//スペース区切りで入力される一行あたりの文字列の数を取得する
String[][] table = new String[n][m];//二次元配列を用意する
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
table[i][j] = sc.next();
}
}
//出力(例として表形式で出力する)
for(int i=0; i<table.length; i++){
for(int j=0; j<table[i].length; j++){
System.out.print(table[i][j]);
}
System.out.println("");
}
}
}
複数行のスペース区切りの数字を受け取る
行数がn行、一行あたりの数字の数がm個で「n m」と半角スペース区切りの一行で与えられているとします。余談ですが、mの数は2個が多い気がします。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//行数を取得する
int m = sc.nextInt();//スペース区切りで入力される一行あたりの数字の数を取得する
int[][] table = new int[n][m];//二次元配列を用意する
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
table[i][j] = sc.nextInt();
}
}
//出力(例として表形式で出力する)
for(int i=0; i<table.length; i++){
for(int j=0; j<table[i].length; j++){
System.out.print(table[i][j]);
}
System.out.println("");
}
}
}
一行目が数字、二行目以降が文字列の標準入力を受け取る
たとえば、文字列の数nが数字で与えられて、続くn+1行分の文字列が与えられるケースです。たとえば、
2
paiza
Java
このような標準入力です。配列で文字列を受け取るパターンと、for文の中で文字列を一つずつ受け取るパターンが考えられます。どちらを使うかはお好みですが、私は後者の受け取り方をすることが多い気がします。
//配列で文字列を受け取るパターン
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//文字列の数を受け取る
String[] words=new String[n];//文字列を格納するためにn個の要素を持つ空の配列を用意
//for文で配列wordsのi番目の要素に文字列を格納
for(int i=0; i<n; i++){
words[i]=sc.next();
}
//配列wordsのi番目の要素(文字列)を要素ごとに改行して出力
for(int i=0; i<n; i++){
System.out.println(words[i]);
}
}
}
//for文で文字列を一つずつを受け取るパターン
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//文字列の数を受け取る
for(int i=0; i<n; i++){
String word=sc.next();
//何らかの処理。ここではwordを改行付きで出力
System.out.println(word);
}
}
}
地図(空白で区切られていない複数行の文字列)を受け取る
Dランクではあまり見かけないパターンです。たとえば、地図の行数nと列数mが数字で与えられて、「.」が移動可能、「#」が壁で移動不可能な場合などです。与えられる入力としては以下のようなものです。
3 3
…
.#.
…
このような標準入力は二次元配列に1文字ずつ格納すると後の処理が楽になるケースが多いです。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//地図の行数を受け取る
int m=sc.nextInt();//地図の列数を受け取る
char[][] map=new char[n][m];//地図を格納するための空の二次元配列を用意
for(int i=0; i<n; i++){
String line=sc.next();
for(int j=0; j<m; j++){
//lineで文字列として受け取った行を1文字ずつ文字型に切り出して、二次元配列に格納
map[i][j]=line.charAt(j);
}
}
//指定されたマスが壁(#)の時に「壁です」と出力する
if(map[1][1]=='#'){//mapの要素はchar型なのでシングルクォーテーションを使う。ダブルクオーテーションではダメ。
System.out.print("壁です。");
}
else{
System.out.print("平地です。");
}
}
}