問題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公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】