未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】オブジェクト指向の応用問題3-4

title


問題3-4

人工の多い都道府県ベスト10を当てるクイズを作成しましょう。
(2021年4月1日現在のデータ)


HashMap<String, Integer>型のマップには、キーに都道府県名、値に順位を格納します。
次のランキング情報を登録してください。

 1位:東京都
 2位:神奈川県
 3位:大阪府
 4位:愛知県
 5位:埼玉県
 6位:千葉県
 7位:兵庫県
 8位:北海道
 9位:福岡県
10位:静岡県


都道府県名の入力受付を行い、その都道府県がランキングに入っていた場合は「正解!」「○○は△位です」と表示して、その都道府県をランキングMapオブジェクトから削除してください。
その都道府県がランキングに入っていなかった場合は「残念・・・」「○○はランキングに入っていません・・・」「ゲームオーバー」と表示して終了します。


ベスト10のすべての都道府県を答えられた場合は、「おめでとうございます!」「ベスト10をすべて答えました!」と表示してゲームを終了します。


【実行結果】

人口の多い都道府県ベスト10を当ててください!
東京都
正解!
東京都は1位です
北海道
正解!
北海道は8位です
沖縄県
残念・・・
沖縄県はランキングに入っていません・・・
ゲームオーバー


【HashMapBasicPractice.java】

public class HashMapBasicPractice {
    public static void main(String[] args) {

        System.out.println("人口の多い都道府県ベスト10を当ててください!");

        // 入力値変数の宣言
        String input;

        // 入力の受付
        input = System.console().readLine();

    }
}


解答例

【HashMapBasicPractice.java】

import java.util.HashMap;

public class HashMapBasicPractice {
    public static void main(String[] args) {

        // ランキングMapオブジェクトの宣言と生成
        HashMap<String, Integer> rankMap = new HashMap<String, Integer>();

        // ランキング情報を登録
        rankMap.put("東京都", 1);
        rankMap.put("神奈川県", 2);
        rankMap.put("大阪府", 3);
        rankMap.put("愛知県", 4);
        rankMap.put("埼玉県", 5);
        rankMap.put("千葉県", 6);
        rankMap.put("兵庫県", 7);
        rankMap.put("北海道", 8);
        rankMap.put("福岡県", 9);
        rankMap.put("静岡県", 10);

        System.out.println("人口の多い都道府県ベスト10を当ててください!");

        // 入力値変数の宣言
        String input;

        while(rankMap.size() != 0) {

            // 入力の受付
            input = System.console().readLine();

            // ランキングMapオブジェクトから順位を取得
            Integer rank = rankMap.get(input);

            // ランキングに入っていた場合
            if(rank != null) {

                System.out.println("正解♪");
                System.out.println(input + "は" + rank + "位です");

                // ランキングMapオブジェクトから入力都道府県を削除
                rankMap.remove(input);
            }
            // ランキングに入っていなかった場合
            else {
                System.out.println("残念・・・");
                System.out.println(input + "はランキングに入っていません・・・");
                System.out.println("ゲームオーバー");

                // ループを抜ける
                break;
            }
        }

        // すべて答えられた場合
        if(rankMap.size() == 0) {
            System.out.println("おめでとうございます♪");
            System.out.println("ベスト10をすべて答えました♪");
        }
    }
}


解説

Map系コレクションはList系コレクションとは異なり、キーと値のセットで登録していきます。

そして、キーを使って値を取り出します。

Map系コレクションは、インデックスという概念がない点に注意してください。



まず最初に、人口の多い都道府県ベスト10を表現するHashMapクラスのインスタンスを生成し、データを登録していきます。

クラス定義の上にjava.utilパッケージのインポート文を忘れないようにしましょう。

// ランキングMapオブジェクトの宣言と生成
HashMap<String, Integer> rankMap = new HashMap<String, Integer>();


ジェネリックスを用いて、キーの型と値の型の両方を指定しているのがポイントです。


今回は、キーが都道府県名のString型、値がランキングのInteger型になっています。

ジェネリックスで指定できる型は参照型のみです。

基本データ型は指定できないので注意してください。



次にキーと値を登録していきます。

List系コレクションに要素を追加するときはaddメソッドを用いますが、Map系コレクションにキーと値を登録するときはputメソッドを使用します。

// ランキング情報を登録
rankMap.put("東京都", 1);



putメソッドは2つの引数を取り、第一引数はキー、第二引数は値になります。


もしすでにキーが使用されていた場合は、値は上書きとなり、戻り値として古い値を返します。

新規登録の場合は、戻り値はnullです。


この独特の動きもしっかり理解しておいてください。



入力を繰り返して回答していくので、while文を使って不定回数ループさせます。

Mapには要素数を返すsizeメソッドがあるので、その戻り値が0でない間ループさせています。



そして入力した都道府県がベスト10に入っているかをチェックするわけですが、キーを使ってMapから値を取り出すにはgetメソッドを使用します。

getメソッドの引数にキーを指定し、戻り値はキーに紐付く値となります。


もしそのキーで値が登録されていない場合にはnullを返します。

今回もgetメソッドの戻り値をInteger型変数に格納し、nullによる判定を行っています。

nullでなければ、クイズに正解したことになるので、メッセージを出力した後にその都道府県データをMapオブジェクトから削除します。

それには、removeメソッドを使用し、引数にキーを指定します。



Integer型変数の値がnullの場合は、不正解のメッセージを出力してからbreakを用いてループを強制終了しています。

while文を抜けてMapオブジェクトの要素数が0の場合は、全問正解した場合だけなので祝福のメッセージを出力しています。



今回の問題は比較的自由度が高い内容なので、異なるコードになった人も多かったかもしれません。

今回はMapコレクションのputメソッド、getメソッド、sizeメソッド、removeメソッドをしっかり理解してください。



Eclipseを使用している場合の補足

今回の解答例をEclipseで実行しようとすると、System.console()の返却値がnullになり動作せず、Null Pointer Exceptionが発生します。

Eclipse内のコンソールで今回のようなプログラムを動作させたい場合、System.console()を使わずに、System.input()をBufferedReader等でくるんだインスタンスを代用すると良いでしょう。

これでEclipseのコンソールで入力した内容が、行単位でプログラムに渡せるようになります。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();


参考図書



LINE公式アカウント

仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】


LineOfficial

友だち追加