【JAVA】レッスン4-03:HashMapを理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:HashMap

この記事の練習問題で使用する知識:
基礎構文、制御構造、メソッド(レッスン1~3)ArrayListHashSetTreeSetHashMapTreeMap

<<前のページ 問題集Top 次のページ>>

JAVAの文法「HashMap」とは

ここではHashMapの意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。



HashMapとは?

HashMapはJAVAのコレクションフレームワークに属するクラスの一つで、キーと値のペアを格納するためのデータ構造です。

キーを使って値にアクセスできるため、非常に効率的にデータの管理や取得が行えます。

例えばキーが「学生のID」、値が「学生の名前」といった形で、IDをキーにして名前を効率的に管理することができます。

HashMapの特徴

  • キーと値のペアで管理: データは、キーのペアとして保存されます。キーを使って値にアクセスすることができるため、簡単にデータを検索できます。
  • 重複したキーは存在できない: 同じキーで異なる値を格納しようとすると、後から追加された値が上書きされます。
  • 順序は保証されない: HashMapは、格納した順序を保証しません。データがどの順序で取り出されるかは不定です。
  • nullを格納できる: HashMapはキーにも値にもnullを使用できますが、キーのnullは一つだけです。

HashMapの使い方

HashMapを使うにはまずインスタンスを作成し、put()メソッドでキーと値を追加します。

データを取得する際はget()メソッドを使います。以下に基本的な使い方の例を示します。

import java.util.HashMap; // HashMapを使用するためのインポート文

public class Main {
    public static void main(String[] args) {
        //String型のキーとString型の値をもつstudentsというHashMapを作成
        HashMap<String, String> students = new HashMap<>();

        // 値を追加 (キー:学生のID, 値:学生の名前)
        students.put("101", "田中");
        students.put("102", "佐藤");
        students.put("103", "鈴木");

        // getメソッドを使って値を取得
        String name = students.get("101");
        System.out.println("ID 101の学生の名前は: " + name);

        // putメソッドを使って重複したキーの追加
        students.put("101", "山田");  // 田中のデータが山田に上書きされる
        System.out.println("ID 101の学生の新しい名前は: " + students.get("101"));

        // キーが存在するか確認
        if (students.containsKey("104")) {
            System.out.println("ID 104の学生が存在します。");
        } else {
            System.out.println("ID 104の学生は存在しません。");
        }
    }
}

よく使うメソッド

  • put(key, value): 指定したキーと値のペアをHashMapに追加します。すでに同じキーが存在する場合、そのキーに対応する値は上書きされます。
  • get(key): 指定したキーに対応する値を取得します。キーが存在しない場合はnullが返されます。
  • remove(key): 指定したキーに対応するエントリを削除します。
  • containsKey(key): 指定したキーが存在するかどうかを確認します。存在する場合はtrueを返します。
  • size(): HashMapに格納されているエントリの数を取得します。

HashMapの活用例

HashMapはデータの検索や管理に強力なツールです。

たとえば商品IDと商品名のペア、社員番号と社員情報のペアなど、大量のデータを扱う際に便利です。

次に学生の成績を管理する例を見てみましょう。

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 学生のIDと成績を格納するHashMap
        HashMap<String, Integer> grades = new HashMap<>();

        // 成績を追加
        grades.put("101", 85);
        grades.put("102", 92);
        grades.put("103", 78);

        // 学生ID 102の成績を表示
        System.out.println("ID 102の成績は: " + grades.get("102"));

        // すべての成績を表示
        for (String id : grades.keySet()) {
            System.out.println("ID " + id + " の成績: " + grades.get(id));
        }
    }
}

この例では学生IDとその成績を管理しています。

keySet()メソッドを使うことですべてのキー(学生ID)を取得し、各IDに対応する成績を表示しています。

まとめ

HashMapはキーと値のペアを使って効率的にデータを管理できる強力なコレクションです。

順序は保証されませんが非常に高速なデータの検索、追加、削除が可能です。プログラム内でデータの管理を簡単にしたい場合に、ぜひ活用してみてください。

HashMapをしっかり理解し、実際に手を動かして練習することで、データ操作の効率が大幅に向上します。

JAVA練習問題4-3:ArrayListとHashMapの違いを理解しよう

Javaのコレクションフレームワークを理解するために、ArrayListとHashMapを使って生徒の名前と点数を管理するプログラムを作成しましょう。

このプログラムではあらかじめ用意された3人の生徒の名前に対して、ユーザーが点数を入力し、それらを表示します。

この問題の要件

以下の要件に従ってプログラムを作成してください。

  • 生徒の名前を格納するArrayListを作成すること。
  • 各生徒の名前に対応する点数を格納するHashMapを作成すること。
  • ユーザーから3人の生徒の点数を入力してもらうこと。
  • 入力された点数をHashMapに格納すること。
  • 全生徒の名前と点数を表示すること。

以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

田中の点数を入力してください: 
85
鈴木の点数を入力してください: 
92
佐藤の点数を入力してください: 
78
田中の点数は85点です。
鈴木の点数は92点です。
佐藤の点数は78点です。

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:ArrayListクラスをインポート
2:HashMapクラスをインポート
3:Scannerクラスをインポート
4:StudentScoresクラスの定義
  □ mainメソッドの定義
  □ □ ArrayListオブジェクトstudentNamesの初期化
  □ □ studentNamesに”田中”を追加
  □ □ studentNamesに”鈴木”を追加
  □ □ studentNamesに”佐藤”を追加
  □ □ HashMapオブジェクトstudentScoresの初期化
  □ □ Scannerオブジェクトscannerの初期化
  □ □ for-eachループでstudentNames内の各名前に対して処理を実行
  □ □ □ ”の点数を入力してください: “と出力
  □ □ □ ユーザーの入力を整数として読み取り、変数scoreに代入
  □ □ □ studentScoresにnameをキー、scoreを値として格納
  □ □ printStudentScoresメソッドを呼び出し
  □ printStudentScoresメソッドの定義
  □ □ for-eachループでnames内の各名前に対して処理を実行
  □ □ □ scoresからnameに対応する点数を取得し、変数scoreに代入
  □ □ □ ”nameの点数はscore点です。”と出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class StudentScores {

    // メインメソッド
    public static void main(String[] args) {
        // 生徒の名前を格納するArrayListを作成
        /* 【穴埋め問題1】
           ここにArrayListの宣言と初期化をするコードを書いてください。
        */
        
        /* 【穴埋め問題2】
           ここでstudentNamesに生徒の名前「田中」「鈴木」「佐藤」を追加してください。
        */

        // 生徒の名前と点数を格納するHashMapを作成
        /* 【穴埋め問題3】
           ここにHashMapの宣言と初期化をするコードを書いてください。
        */

        // スキャナを作成してユーザー入力を受け取る
        Scanner scanner = new Scanner(System.in);

        // 生徒ごとに点数を入力してもらう
        for (String name : studentNames) {
            System.out.println(name + "の点数を入力してください: ");
            int score = scanner.nextInt();
            /* 【穴埋め問題4】
               ここでHashMapのstudentScoresに名前と点数を登録するコードを書いてください。
            */
        }

        // 全生徒の点数を表示するメソッドを呼び出し
        printStudentScores(studentNames, studentScores);
    }

    // 全生徒の点数を表示するメソッド
    public static void printStudentScores(ArrayList<String> names, HashMap<String, Integer> scores) {
        // ArrayListから名前を一つずつ取り出す
        for (String name : names) {
            // HashMapから対応する点数を取得
            Integer score = scores.get(name);
            // 名前と点数を表示
            System.out.println(name + "の点数は" + score + "点です。");
        }
    }
}

この問題の穴埋めコードは以上です。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class StudentScores {

    // メインメソッド
    public static void main(String[] args) {
        // 生徒の名前を格納するArrayListを作成
        ArrayList<String> studentNames = new ArrayList<>();
        studentNames.add("田中");
        studentNames.add("鈴木");
        studentNames.add("佐藤");

        // 生徒の名前と点数を格納するHashMapを作成
        HashMap<String, Integer> studentScores = new HashMap<>();

        // スキャナを作成してユーザー入力を受け取る
        Scanner scanner = new Scanner(System.in);

        // 生徒ごとに点数を入力してもらう
        for (String name : studentNames) {
            System.out.println(name + "の点数を入力してください: ");
            int score = scanner.nextInt();
            studentScores.put(name, score);
        }

        // 全生徒の点数を表示するメソッドを呼び出し
        printStudentScores(studentNames, studentScores);
    }

    // 全生徒の点数を表示するメソッド
    public static void printStudentScores(ArrayList<String> names, HashMap<String, Integer> scores) {
        // ArrayListから名前を一つずつ取り出す
        for (String name : names) {
            // HashMapから対応する点数を取得
            Integer score = scores.get(name);
            // 名前と点数を表示
            System.out.println(name + "の点数は" + score + "点です。");
        }
    }
}

********************

正解コードの解説

今回のJavaプログラムは生徒の名前とそれぞれの点数を入力し、その結果を表示するものです。

コードの各部分について初心者向けに説明していきます。

必要なクラスのインポート

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

ArrayList は、複数の要素(ここでは生徒の名前)を格納するために使用します。

HashMap はキーと値のペアを格納するためのクラスで、ここではキーに生徒の名前、値にその点数を対応させています。

Scanner は、コンソールからユーザーの入力を受け取るために使います。

メインメソッドの宣言と生徒の名前の管理

public static void main(String[] args) {
    ArrayList<String> studentNames = new ArrayList<>();
    studentNames.add("田中");
    studentNames.add("鈴木");
    studentNames.add("佐藤");

public static void main(String[] args) はJavaプログラムのエントリーポイントです。プログラムが開始されると、このメソッドが最初に実行されます。

ArrayList<String> studentNames = new ArrayList<>(); は、生徒の名前を格納するためのリストを作成しています。

addメソッドを使って、生徒の名前をリストに追加しています。

生徒の名前と点数の管理

HashMap<String, Integer> studentScores = new HashMap<>();

ここでHashMapを使って生徒の名前(キー)とその点数(値)を管理しています。

このプログラムではキーとして生徒の名前、値として点数(Integer型)を格納しています。

点数の入力

Scanner scanner = new Scanner(System.in);
for (String name : studentNames) {
    System.out.println(name + "の点数を入力してください: ");
    int score = scanner.nextInt();
    studentScores.put(name, score);
}

Scanner scanner = new Scanner(System.in); で、ユーザーからコンソールでの入力を受け取るための準備をします。

for (String name : studentNames)studentNamesリストに格納されている名前を順番に取り出し、その名前に対応する点数を入力させます。

scanner.nextInt() で入力された整数(点数)を読み取り、その名前と点数をHashMapに追加します。

生徒の点数を表示するメソッド

printStudentScores(studentNames, studentScores);

ここで生徒の名前と点数を表示するためにprintStudentScoresメソッドを呼び出しています。

このメソッドに生徒の名前と点数を引数として渡しています。

点数を表示するメソッドの詳細

public static void printStudentScores(ArrayList<String> names, HashMap<String, Integer> scores) {
    for (String name : names) {
        Integer score = scores.get(name);
        System.out.println(name + "の点数は" + score + "点です。");
    }
}

このメソッドではArrayListから生徒の名前を1つずつ取り出し、HashMapを使ってその名前に対応する点数を取得します。

そしてSystem.out.println()で名前と点数をコンソールに表示します。

まとめ

このプログラムでは生徒の名前と点数をArrayListHashMapを使って管理し、点数の入力と表示を行っています。

特にHashMapのようなデータ構造は実際のプログラムでもよく使われるので、ぜひ理解を深めましょう。

<<前のページ 問題集Top 次のページ>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    JAVAテキスト&問題集へ戻る
    トップページへ戻る