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

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

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

この問題を解くために必要な知識:
【レベル1~2の知識】
コメントの書き方、変数と定数、基本データ型、算術演算と論理演算、入力と出力、import文、配列、分岐処理(if、if~else、when)、繰り返し処理(for、while、do~while)、Null安全、スマートキャスト、関数の定義と呼び出し、関数の戻り値、関数のオーバーロード、ラベルとジャンプ、例外処理、クラスの定義と使用、インスタンス、コンストラクタ、プロパティ、クラスの継承、クラスの拡張

【レベル3の知識】
コレクションの基礎、リストコレクション(MutableList、ArrayList)、セットコレクション(HashSet、MutableSet、TreeSet)、マップコレクション(HashMap、MutableMap、TreeMap)

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

Kotlinの文法「HashMap」とは

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



Kotlinでよく使われるコレクションの一つにHashMapがあります。

これはキーと値のペアを格納し、キーを使って値に高速にアクセスできるデータ構造です。

特に、データの検索や管理を効率的に行いたいときに便利です。

HashMapとは?

HashMapは、キーと値をペアで保存するコレクションです。

キーはユニークである必要があり、同じキーを使って値を上書きすることが可能です。

KotlinのHashMapは、内部でハッシュテーブルを使用しており、データの検索、挿入、削除が非常に効率的に行えます。

また、キーの順序は保証されませんが、その分高速な操作が可能です。

HashMapの使い方

Kotlinでは、hashMapOf()関数を使って簡単にHashMapを作成できます。

例えば、次のコードでは、生徒の名前をキーとして、そのテストの点数を値として格納しています。

val studentScores = hashMapOf("Alice" to 85, "Bob" to 90, "Charlie" to 78)

このように、"Alice"というキーに対して85という値を格納する形式です。

"Alice"という名前を使って簡単に対応する点数を取得することができます。

HashMapの操作例

ここでは、HashMapを使ってさまざまな操作を行う方法を紹介します。基本的な操作として、値の取得、追加、削除があります。

// HashMapの作成
val studentScores = hashMapOf("Alice" to 85, "Bob" to 90, "Charlie" to 78)

// 値の取得
val aliceScore = studentScores["Alice"]
println("Aliceの点数は $aliceScore 点です")

// 新しいエントリーの追加
studentScores["David"] = 92
println("Davidの点数は ${studentScores["David"]} 点です")

// キーが存在するかの確認
if (studentScores.containsKey("Bob")) {
    println("Bobの点数は ${studentScores["Bob"]} 点です")
}

// エントリーの削除
studentScores.remove("Charlie")
println("Charlieのデータを削除しました")

このコードの各操作は次のように動作します。

  • studentScores["Alice"]でキー”Alice“に対応する値を取得し、点数を表示しています。
  • studentScores["David"] = 92で新しい生徒”David“とその点数を追加しています。
  • containsKey("Bob")を使って、キー”Bob“が存在するかを確認し、存在すればその点数を表示します。
  • remove("Charlie")でキー”Charlie“に対応するエントリーを削除します。

HashMapのメリットとデメリット

HashMapは非常に効率的なデータ管理方法で、大量のデータを扱う際に特に便利です。キーを使って素早く値にアクセスでき、データの追加や削除も非常に高速に行えます。

また、キーがユニークであるため、同じキーで値を上書きすることで、データを簡単に更新することも可能です。

一方で、HashMapはキーの順序を保証しないため、要素の順序が重要な場合には不向きです。順序が重要な場合は、他のコレクションを検討する必要があります。

まとめ

HashMapは、Kotlinで使いやすいコレクションの一つで、キーと値をペアとして効率的に管理できます。

特に大規模なデータの処理や、高速な検索が求められる場合に非常に有用です。

hashMapOf関数を使って簡単に作成でき、データの取得、追加、削除といった操作もシンプルに実装できます。




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

3人の学生の情報を管理するプログラムを作成しましょう。

ArrayListとHashMapを使用し、この3人の名前とテストの得点を管理・表示させて下さい。

この問題の要件

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

  • 学生の名前を格納するために ArrayList<String> を使用すること。
  • 学生の得点を表示するために printArrayList 関数を作成すること。
  • 特定の学生の得点を取得するために getScore 関数を作成すること。
  • 以下の学生の名前と得点を使用してください。
    • 佐藤: 85
    • 鈴木: 92
    • 田中: 78

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

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

以下はArrayListによる表示
学生の名前一覧:
佐藤
鈴木
田中
以下はHashMapによる表示
学生の得点一覧:
佐藤 さんの得点: 85
鈴木 さんの得点: 92
田中 さんの得点: 78
鈴木 さんの得点を取得します
鈴木 さんの得点: 92

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

この問題を解くヒント

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

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

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

1.import文の宣言はなし
2.main関数の定義
 2-1. ArrayListの作成と初期化
  2-1-1. 学生の名前を格納するArrayListを作成
  2-1-2. 学生の名前をArrayListに追加
 2-2. HashMapの作成と初期化
  2-2-1. 学生の名前と得点を格納するHashMapを作成
  2-2-2. HashMapに学生の名前と得点を追加
 2-3. ArrayListの内容を表示するための関数呼び出し
 2-4. HashMapの内容を表示するための関数呼び出し
 2-5. 特定の学生の得点を取得するためのメッセージ表示と関数呼び出し
3.printArrayList関数の定義
 3-1. 関数の定義とArrayListの内容を表示するための処理
  3-1-1. ArrayListの内容を繰り返し処理で表示
4.printHashMap関数の定義
 4-1. 関数の定義とHashMapの内容を表示するための処理
  4-1-1. HashMapの内容を繰り返し処理で表示
5.getScore関数の定義
 5-1. 関数の定義とHashMapから特定の学生の得点を取得する処理

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

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

fun main() {
    // ArrayListに学生の名前を格納
    val studentNames = arrayListOf<String>()
    studentNames.add("佐藤")
    studentNames.add("鈴木")
    studentNames.add("田中")

    // HashMapに学生の名前と得点を格納
    val studentScores = hashMapOf<String, Int>()
    studentScores["佐藤"] = 85
    studentScores["鈴木"] = 92
    studentScores["田中"] = 78

    // ArrayListの内容を表示する関数を呼び出し
    println("以下はArrayListによる表示")
    printArrayList(studentNames)

    // HashMapの内容を表示する関数を呼び出し
    println("以下はHashMapによる表示")
    printHashMap(studentScores)

    // HashMapから特定の学生の得点を取得する前にメッセージを表示
    val nameToFind = "鈴木"
    println("$nameToFind さんの得点を取得します")
    val score = getScore(studentScores, nameToFind)
    if (score != null) {
        println("$nameToFind さんの得点: $score")
    } else {
        println("$nameToFind さんの得点は見つかりませんでした")
    }
}

// ArrayListの内容を表示する関数
fun printArrayList(list: ArrayList<String>) {
    println("学生の名前一覧:")
    /* ここにforループを使用してArrayListの内容を表示するコードを書いてください */
    /*
    for (name in list) {
        println(name)
    }
    */
}

// HashMapの内容を表示する関数
fun printHashMap(map: HashMap<String, Int>) {
    println("学生の得点一覧:")
    /* ここにforループを使用してHashMapの内容を表示するコードを書いてください */
    /*
    for ((name, score) in map) {
        println("$name さんの得点: $score")
    }
    */
}

// HashMapから特定の学生の得点を取得する関数
fun getScore(map: HashMap<String, Int>, name: String): Int? {
    /* ここにHashMapから特定の学生の得点を取得するコードを書いてください */
    /*
    return map[name]
    */
}

 

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

解答例

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

正解コードの例

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

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

fun main() {
    // ArrayListに学生の名前を格納
    val studentNames = arrayListOf<String>()
    studentNames.add("佐藤")
    studentNames.add("鈴木")
    studentNames.add("田中")

    // HashMapに学生の名前と得点を格納
    val studentScores = hashMapOf<String, Int>()
    studentScores["佐藤"] = 85
    studentScores["鈴木"] = 92
    studentScores["田中"] = 78

    // ArrayListの内容を表示する関数を呼び出し
    println("以下はArrayListによる表示")
    printArrayList(studentNames)

    // HashMapの内容を表示する関数を呼び出し
    println("以下はHashMapによる表示")
    printHashMap(studentScores)

    // HashMapから特定の学生の得点を取得する前にメッセージを表示
    val nameToFind = "鈴木"
    println("$nameToFind さんの得点を取得します")
    val score = getScore(studentScores, nameToFind)
    if (score != null) {
        println("$nameToFind さんの得点: $score")
    } else {
        println("$nameToFind さんの得点は見つかりませんでした")
    }
}

// ArrayListの内容を表示する関数
fun printArrayList(list: ArrayList<String>) {
    println("学生の名前一覧:")
    for (name in list) {
        println(name)
    }
}

// HashMapの内容を表示する関数
fun printHashMap(map: HashMap<String, Int>) {
    println("学生の得点一覧:")
    for ((name, score) in map) {
        println("$name さんの得点: $score")
    }
}

// HashMapから特定の学生の得点を取得する関数
fun getScore(map: HashMap<String, Int>, name: String): Int? {
    return map[name]
}

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

コードの解説

このKotlinコードでは、ArrayListHashMapを使って学生の名前と得点を管理しています。特に、HashMapの仕組みや基本操作について詳しく説明します。

メイン関数

fun main() {
    // ArrayListに学生の名前を格納
    val studentNames = arrayListOf<String>()
    studentNames.add("佐藤")
    studentNames.add("鈴木")
    studentNames.add("田中")

    // HashMapに学生の名前と得点を格納
    val studentScores = hashMapOf<String, Int>()
    studentScores["佐藤"] = 85
    studentScores["鈴木"] = 92
    studentScores["田中"] = 78

この部分では、ArrayListHashMapを使って学生のデータを管理しています。

ArrayListは名前だけを順番に格納しますが、HashMapはキー(学生の名前)と値(得点)のペアを格納します。

例えば、"佐藤"というキーには85という得点が対応しています。

ArrayListの内容を表示

    // ArrayListの内容を表示する関数を呼び出し
    println("以下はArrayListによる表示")
    printArrayList(studentNames)

ArrayListに格納された学生の名前を表示する関数が呼び出されています。これは単に名前を一覧表示するための部分です。

HashMapの内容を表示

    // HashMapの内容を表示する関数を呼び出し
    println("以下はHashMapによる表示")
    printHashMap(studentScores)

ここでは、HashMapに格納された名前と得点を表示しています。

HashMapは、名前と得点のペアを保持し、名前(キー)を使って対応する得点(値)を簡単に取得できます。

HashMapのデータ構造は、検索や挿入が高速で行えるため、大量のデータ管理に向いています。

特定の学生の得点を取得

    // HashMapから特定の学生の得点を取得する前にメッセージを表示
    val nameToFind = "鈴木"
    println("$nameToFind さんの得点を取得します")
    val score = getScore(studentScores, nameToFind)
    if (score != null) {
        println("$nameToFind さんの得点: $score")
    } else {
        println("$nameToFind さんの得点は見つかりませんでした")
    }

この部分では、HashMapを使って特定の名前(ここでは「鈴木」)に対応する得点を取得しています。

HashMap[]演算子を使って、キーに対応する値(得点)を取り出すことができます。

存在しないキーを指定すると、nullが返されるため、それを使って条件分岐を行っています。

ArrayListの内容を表示する関数

fun printArrayList(list: ArrayList<String>) {
    println("学生の名前一覧:")
    for (name in list) {
        println(name)
    }
}

この関数はArrayListに格納された名前を順番に表示します。

HashMapの内容を表示する関数

fun printHashMap(map: HashMap<String, Int>) {
    println("学生の得点一覧:")
    for ((name, score) in map) {
        println("$name さんの得点: $score")
    }
}

この関数では、HashMapのキーと値をペアで表示します。for ((name, score) in map)のように、HashMapの要素をループで取り出すことができます。

特定の学生の得点を取得する関数

fun getScore(map: HashMap<String, Int>, name: String): Int? {
    return map[name]
}

この関数は、指定された名前(キー)に対応する得点(値)を返します。

HashMapは、キーを使って対応する値を簡単に取得できるため、特定の学生の得点を探すのに便利です。

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

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

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

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






    Kotlin練習問題集へ戻る
    トップページへ戻る