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("平地です。");
        }
    }
}

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA