📚 この回で学ぶこと
学習時間: 約40分
難易度: ★★★☆☆(3/5)
学習目標
ArrayListの次は? キー・値ペアで効率的なデータ管理を実現しよう!
第3回までの問題点:
// ArrayList では「名前で検索」が大変
ArrayList<Player> party = new ArrayList<>();
party.add(new Player("勇者", 100, 15));
party.add(new Player("戦士", 120, 12));
// 「勇者」を探すには全要素をループで探索...
for (Player p : party) {
if (p.getName().equals("勇者")) {
// 見つかった!
}
}
第4回で解決:
// HashMap なら「キー」で直接アクセス!
Map<String, Player> playerMap = new HashMap<>();
playerMap.put("勇者", new Player("勇者", 100, 15));
playerMap.put("戦士", new Player("戦士", 120, 12));
// 「勇者」を一発で取得! O(1)
Player hero = playerMap.get("勇者");
📁 成果物のファイル構成
この回で作成するスキル辞書・アイテム図鑑システムのファイル構成:
📂 rpg_dictionary_system/
├── 📂 src/
│ ├── 📂 com/
│ │ └── 📂 javaquest/
│ │ ├── 📂 model/
│ │ │ └── 📝 Skill.java // スキル情報クラス(新規)
│ │ ├── 📂 manager/
│ │ │ └── 📝 SkillManager.java // スキル辞書管理(新規)
│ │ └── 📝 RPGSystem.java // メインシステム
│ └── 📂 practice/
│ ├── 📝 MoneyManager.java // 練習問题1
│ └── 📝 SkillLevelManager.java // 練習問题2
└── 📝 README.md // 実行手順書
パッケージ構成の意味:
-
com.javaquest.model→ データクラス(Skill) -
com.javaquest.manager→ 管理クラス(HashMap活用システム) -
com.javaquest→ メインシステム -
practice→ 練習問題用ファイル
📚GitHub:成果物のサンプルはこちら
この回で身につくスキル
HashMap - キー・値ペアの管理
辞書システム - スキル辞書・アイテム図鑑
高速検索 - O(1)の効率的なデータアクセス
実務スキル - 統計・集計機能
基礎知識
1. HashMap とは?
HashMap は、キー(Key)と値(Value) のペアでデータを管理するコレクションです。
キー・値ペアの概念
// 辞書のようなデータ構造
Map<String, Integer> dictionary = new HashMap<>();
// キー → 値
dictionary.put("apple", 100); // 「apple」というキーに「100」という値を紐付け
dictionary.put("banana", 80);
dictionary.put("orange", 120);
// キーで直接アクセス
int price = dictionary.get("apple"); // → 100
実世界の例:
- 辞書: 単語(キー) → 意味(値)
- 電話帳: 名前(キー) → 電話番号(値)
- ゲーム: スキル名(キー) → スキル情報(値)
2. HashMap vs ArrayList
| 観点 | ArrayList | HashMap |
|---|---|---|
| データ構造 | 順序付きリスト | キー・値ペア |
| アクセス方法 | インデックス番号 | キー |
| 検索速度 | O(n) - 全探索 | O(1) - 直接アクセス ⚡ |
| 順序保持 | ✅ 保持される | ❌ 保持されない |
| 重複キー | - | ❌ 不可(上書きされる) |
| 用途 | 順序が重要なリスト | 名前で検索する辞書 |
使い分けの基準:
- 順序が重要 → ArrayList
- 名前で検索したい → HashMap
- 統計・集計 → HashMap
3. HashMap の基本操作
import java.util.*;
public class HashMapBasics {
public static void main(String[] args) {
// 宣言と初期化
Map<String, Integer> levels = new HashMap<>();
// ➕ 追加・更新(put)
levels.put("勇者", 15);
levels.put("戦士", 12);
levels.put("魔法使い", 18);
// 取得(get)
int heroLevel = levels.get("勇者"); // → 15
// 存在確認(containsKey)
if (levels.containsKey("勇者")) {
System.out.println("勇者が見つかりました!");
}
// 削除(remove)
levels.remove("戦士");
// サイズ取得
int size = levels.size(); // → 2
// 全要素の表示(keySet)
for (String name : levels.keySet()) {
int level = levels.get(name);
System.out.println(name + " Lv." + level);
}
}
}
実行結果:
勇者が見つかりました!
勇者 Lv.15
魔法使い Lv.18
4. HashMap の重要メソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
put(K key, V value) |
キー・値ペアを追加 (既存キーは上書き) |
以前の値(なければnull) |
get(K key) |
キーに対応する値を取得 | 値(なければnull) |
remove(K key) |
キーと値を削除 | 削除された値 |
containsKey(K key) |
キーの存在確認 | boolean |
containsValue(V value) |
値の存在確認 | boolean |
keySet() |
全キーの集合を取得 | Set |
values() |
全値のコレクションを取得 | Collection<V> |
entrySet() |
全エントリの集合を取得 | Set<Entry<K,V>> |
size() |
要素数を取得 | int |
isEmpty() |
空かどうか確認 | boolean |
clear() |
全要素を削除 | void |
実装演習
Phase 1: Skill クラス - スキル情報
まず、スキル情報を管理するクラスを作成します。
package com.javaquest.model;
/**
* RPGゲームのスキルを表すクラス
* スキル名、MPコスト、威力の情報を保持する
*/
public class Skill {
private String name;
private int mpCost;
private int power;
/**
* Skillクラスのコンストラクタ
* @param name スキル名
* @param mpCost MPコスト
* @param power スキルの威力
*/
public Skill(String name, int mpCost, int power) {
this.name = name;
this.mpCost = mpCost;
this.power = power;
}
/**
* スキル名を取得する
* @return スキル名
*/
public String getName() { return name; }
/**
* スキルの詳細情報を文字列で取得する
* @return スキル名、威力、MPコストを含む情報文字列
*/
public String getInfo() {
return name + " (威力:" + power + " MP:" + mpCost + ")";
}
}
Phase 2: SkillManager - スキル辞書システム
スキル名をキーにして、スキル情報を管理する辞書システムを作ります。
package com.javaquest.manager;
import java.util.HashMap;
import java.util.Map;
import com.javaquest.model.Skill;
/**
* RPGゲームのスキル管理を行うクラス
* スキルの登録、取得、表示機能を提供する
*/
public class SkillManager {
private Map<String, Skill> skills;
/**
* SkillManagerのコンストラクタ
* 初期スキル(ファイア、サンダー、ヒール)を登録する
*/
public SkillManager() {
this.skills = new HashMap<>();
// 初期スキルを3つだけ登録
skills.put("ファイア", new Skill("ファイア", 10, 50));
skills.put("サンダー", new Skill("サンダー", 15, 70));
skills.put("ヒール", new Skill("ヒール", 8, 40));
}
/**
* 指定された名前のスキルを取得する
* @param name スキル名
* @return 該当するSkillオブジェクト、存在しない場合はnull
*/
public Skill getSkill(String name) {
return skills.get(name);
}
/**
* 指定された名前のスキルが存在するかを確認する
* @param name スキル名
* @return スキルが存在する場合true、存在しない場合false
*/
public boolean hasSkill(String name) {
return skills.containsKey(name);
}
/**
* 指定されたスキルの情報を表示する
* スキルが存在しない場合はエラーメッセージを表示する
* @param name 表示するスキル名
*/
public void showSkill(String name) {
if (hasSkill(name)) {
System.out.println("📖 " + getSkill(name).getInfo());
} else {
System.out.println("❌ スキル「" + name + "」は未登録です");
}
}
/**
* 登録されている全スキルの情報を表示する
*/
public void showAllSkills() {
System.out.println("=== スキル一覧 ===");
for (Skill skill : skills.values()) {
System.out.println(" " + skill.getInfo());
}
}
}
Phase 3: RPGSystem - 動作確認
package com.javaquest;
import com.javaquest.manager.SkillManager;
/**
* RPGシステムのメインクラス
* HashMapの演習としてスキル管理機能をデモンストレーションする
*/
public class RPGSystem {
/**
* メインメソッド
* SkillManagerを使用してスキルの検索と表示を実行する
* @param args コマンドライン引数
*/
public static void main(String[] args) {
System.out.println("=== HashMap 演習 ===\n");
SkillManager mgr = new SkillManager();
// スキル検索
mgr.showSkill("ファイア");
mgr.showSkill("サンダー");
mgr.showSkill("メテオ"); // 存在しない
System.out.println();
// 全スキル表示
mgr.showAllSkills();
}
}
実行結果:
=== HashMap 演習 ===
📖 ファイア (威力:50 MP:10)
📖 サンダー (威力:70 MP:15)
❌ スキル「メテオ」は未登録です
=== スキル一覧 ===
ファイア (威力:50 MP:10)
サンダー (威力:70 MP:15)
ヒール (威力:40 MP:8)
練習問題
練習1: プレイヤー名と所持金の管理
課題: プレイヤー名をキー、所持金を値とする HashMap を作成してください。
package practice;
import java.util.*;
public class MoneyManager {
public static void main(String[] args) {
// TODO: プレイヤー名と所持金のマップを作成
Map<String, Integer> playerMoney = new HashMap<>();
// TODO: 以下のデータを登録
// 勇者: 1000ゴールド
// 戦士: 800ゴールド
// 魔法使い: 600ゴールド
// TODO: 「勇者」の所持金を表示
// TODO: 全員の所持金を表示
}
}
解答例を見る
package practice;
import java.util.HashMap;
import java.util.Map;
/**
* RPGゲームのプレイヤーの所持金管理を行うクラス
* HashMapを使用してプレイヤー名と所持金を管理する
*/
public class MoneyManager {
/**
* メインメソッド
* プレイヤーの所持金データを登録し、表示するデモンストレーション
* @param args コマンドライン引数
*/
public static void main(String[] args) {
Map<String, Integer> playerMoney = new HashMap<>();
// データ登録
playerMoney.put("勇者", 1000);
playerMoney.put("戦士", 800);
playerMoney.put("魔法使い", 600);
// 「勇者」の所持金を表示
System.out.println("勇者の所持金: " + playerMoney.get("勇者") + "G");
// 全員の所持金を表示
System.out.println("\n=== 全員の所持金 ===");
for (String name : playerMoney.keySet()) {
int money = playerMoney.get(name);
System.out.println(name + ": " + money + "G");
}
}
}
実行結果:
勇者の所持金: 1000G
=== 全員の所持金 ===
勇者: 1000G
戦士: 800G
魔法使い: 600G
練習2: スキルレベル管理システム
課題: スキル名とレベルを管理するシステムを作成してください。
package practice;
import java.util.*;
public class SkillLevelManager {
public static void main(String[] args) {
// TODO: スキル名とレベルのマップを作成
// TODO: 以下のスキルを登録
// ファイア: Lv.3
// サンダー: Lv.2
// ブリザド: Lv.1
// TODO: ファイアのレベルを4に上げる(put で上書き)
// TODO: 全スキルのレベルを表示
}
}
解答例を見る
package practice;
import java.util.HashMap;
import java.util.Map;
/**
* RPGゲームのスキルレベル管理を行うクラス
* HashMapを使用してスキル名とレベルを管理し、レベルアップ機能をデモンストレーションする
*/
public class SkillLevelManager {
/**
* メインメソッド
* スキルレベルの初期化、表示、レベルアップを実行する
* @param args コマンドライン引数
*/
public static void main(String[] args) {
Map<String, Integer> skillLevels = new HashMap<>();
// スキル登録
skillLevels.put("ファイア", 3);
skillLevels.put("サンダー", 2);
skillLevels.put("ブリザド", 1);
System.out.println("【初期状態】");
displaySkills(skillLevels);
// ファイアのレベルアップ
skillLevels.put("ファイア", 4);
System.out.println("\n🔥 ファイアがレベルアップ!\n");
System.out.println("【レベルアップ後】");
displaySkills(skillLevels);
}
/**
* スキル情報を表示するプライベートメソッド
* @param skills スキル名とレベルのマップ
*/
private static void displaySkills(Map<String, Integer> skills) {
for (String skillName : skills.keySet()) {
int level = skills.get(skillName);
System.out.println(skillName + " Lv." + level);
}
}
}
実行結果:
【初期状態】
ファイア Lv.3
サンダー Lv.2
ブリザド Lv.1
🔥 ファイアがレベルアップ!
【レベルアップ後】
ファイア Lv.4
サンダー Lv.2
ブリザド Lv.1
まとめ
今回学んだこと
1.HashMap の基本
- キー・値ペアでデータを管理
- O(1) の高速検索
- put/get/remove/containsKey の操作
2.実践的な活用
- スキル辞書システム
- アイテム図鑑システム
- 職業別統計機能
3.HashMap vs ArrayList
- 順序が重要 → ArrayList
- 名前で検索 → HashMap
- 統計・集計 → HashMap
重要ポイント
HashMap の特徴
- ✅ 高速検索: O(1) の直接アクセス
- ✅ 柔軟な管理: キーで直感的にアクセス
- ❌ 順序なし: 挿入順序は保持されない
- ❌ 重複キー不可: 同じキーは上書きされる
実務での活用
- 辞書・図鑑システム: 名前で検索
- 統計・集計: グループ化と集計
- 設定管理: キー・値の設定ファイル(次回学習)
💡 HashMap vs ArrayList 使い分け
| 用途 | おすすめ | 理由 |
|---|---|---|
| パーティメンバーのリスト | ArrayList | 順序が重要 |
| スキル辞書 | HashMap | 名前で検索 |
| アイテム図鑑 | HashMap | IDで検索 |
| 職業別統計 | HashMap | グループ化 |
| 戦闘ログ | ArrayList | 時系列順 |
次回予告
第5回:文字列処理でデータを整形しよう!
第4回で HashMap を学んだので、次はデータを見やすく表示する方法を学びます!
// 第4回までの処理
Map<String, Integer> levels = new HashMap<>();
levels.put("勇者", 15);
levels.put("戦士", 12);
// 次回学ぶ String.format で整形!
System.out.println(String.format("%-8s Lv.%2d", "勇者", 15));
// → "勇者 Lv.15" (きれいに整列!)
学習内容:
- String.format による書式指定
- StringBuilder による効率的な文字列生成
- split/join による分割・結合
- 戦闘ログ・レポート生成
お疲れ様でした!
📚 参考資料
関連記事
-
Java Quest Part 2 第5回「文字列処理でデータを整形しよう!」(次回)
本記事は教育目的で作成されています。RPGの例を通じてプログラミング概念を楽しく学習できることを目指しています。



