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

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

JAVAの初心者向け問題3-3:ArrayListとHashMapの違いを理解しよう

この問題を解くために必要な知識:
【レベル1~2の知識】
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力(Scannerクラス)、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)、メソッドの定義と呼び出し、メソッドの戻り値、メソッドのオーバーロード、例外処理(try-catch文、throws、throw)、クラスの定義と使用、インスタンス、コンストラクタ

【レベル3の知識】
コレクションの基礎、コレクション(List, ArrayList)、コレクション(HashSet, TreeSet)、コレクション(HashMap, TreeMap)

<<前の問題 問題集Top 次の問題>>

JAVAの文法「HashMap」とは

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



HashMapとは?

HashMapは、JAVAのコレクションフレームワークに属するクラスの一つで、キーと値のペアを格納するためのデータ構造です。キーを使って値にアクセスできるため、非常に効率的にデータの管理や取得が行えます。

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

HashMapの特徴

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

HashMapの使い方

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

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

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // HashMapの作成
        HashMap<String, String> students = new HashMap<>();

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

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

        // 重複したキーの追加
        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練習問題3-3:ArrayListとHashMapの違いを理解しよう

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

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

この問題の要件

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

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

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

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

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

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

この問題を解くヒント

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

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

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

1.import文
 1-1. ArrayListクラスのインポート
 1-2. HashMapクラスのインポート
 1-3. Scannerクラスのインポート
2.StudentScoresクラスの定義
 2-1. mainメソッドの定義
  2-1-1. 生徒の名前を格納するArrayListの作成
   2-1-1-1. “田中”をArrayListに追加
   2-1-1-2. “鈴木”をArrayListに追加
   2-1-1-3. “佐藤”をArrayListに追加
  2-1-2. 生徒の名前と点数を格納するHashMapの作成
  2-1-3. Scannerオブジェクトの作成
  2-1-4. 各生徒の点数を入力してもらうforループ
   2-1-4-1. 各生徒の名前を出力し点数の入力を促す
   2-1-4-2. 入力された点数を変数scoreに格納
   2-1-4-3. 名前をキー、点数を値としてHashMapに格納
  2-1-5. 全生徒の点数を表示するメソッドprintStudentScoresの呼び出し
  2-1-6. Scannerオブジェクトを閉じる
3.printStudentScoresメソッドの定義
 3-1. 引数としてArrayListとHashMapを受け取る
  3-1-1. ArrayListから名前を一つずつ取り出す
  3-1-2. HashMapから対応する点数を取得
  3-1-3. 名前と点数を出力

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

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

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

public class StudentScores {

    // メインメソッド
    public static void main(String[] args) {
        // ***ここでArrayListを作成し、生徒の名前を追加してください***
        // 生徒の名前を格納するArrayListを作成
        // ***ここで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);
        
        // スキャナを閉じる
        scanner.close();
    }

    // 全生徒の点数を表示するメソッド
    public static void printStudentScores(ArrayList<String> names, HashMap<String, Integer> scores) {
        // ArrayListから名前を一つずつ取り出す
        // ***ここでArrayListから名前を取り出し、HashMapから対応する点数を取得して表示するコードを書いてください***
        for (String name : names) {
            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);
        
        // スキャナを閉じる
        scanner.close();
    }

    // 全生徒の点数を表示するメソッド
    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を使って生徒の名前(キー)とその点数(値)を管理しています。

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メソッドを呼び出しています。

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

スキャナを閉じる

scanner.close();

Scannerは、使い終わったら必ずclose()メソッドを呼び出してリソースを解放する必要があります。

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

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練習問題集へ戻る
    トップページへ戻る