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

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

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

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

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

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

Kotlinの文法「○○○」とは

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



Kotlinにはさまざまなコレクションのデータ構造が用意されていますが、その中でも「TreeMap」はキーと値のペアを持つデータ構造の一つです。

TreeMapはキーの順序に従って要素がソートされるため、特定の順序を保持しながらデータを管理したい場合に便利です。

また、TreeMapは「Red-Black Tree」と呼ばれる二分探索木を使って要素を管理しています。

TreeMapの使用例

TreeMapの使い方はシンプルで、他のマップと同様にキーと値を関連付けるデータ構造です。

以下に、KotlinでのTreeMapの基本的な使用例を紹介します。

fun main() {
    // TreeMapの初期化
    val treeMap = TreeMap<String, Int>()
    
    // 要素を追加
    treeMap["りんご"] = 3
    treeMap["バナナ"] = 2
    treeMap["みかん"] = 5

    // TreeMapの表示(キーの順序でソートされる)
    for ((key, value) in treeMap) {
        println("キー: $key, 値: $value")
    }

    // 特定のキーの値を取得
    println("りんごの値は: ${treeMap["りんご"]}")

    // キーの削除
    treeMap.remove("バナナ")
    println("バナナを削除後のTreeMap: $treeMap")
}

このコードでは、文字列をキーとしてTreeMapに「りんご」、「バナナ」、「みかん」のデータを追加し、それらをキーに基づいてソートされた順序で表示しています。

また、キー「バナナ」を削除した後の状態も確認できます。

TreeMapは常にキーの順序に従って要素がソートされるため、辞書順でデータが整理されます。

TreeMapの特徴と操作

TreeMapの主な特徴は、要素がキーに基づいてソートされる点です。

他のマップと異なり、順序が保持されるため、ソートされたデータを必要とする場面で特に有用です。

以下では、TreeMapのいくつかの操作について説明します。

  • 要素の追加: putまたは[]演算子を使って要素を追加します。
  • 要素の取得: getまたは[]演算子でキーを指定して要素を取得します。
  • 要素の削除: removeメソッドで特定のキーを削除できます。

例えば、treeMap.put("ぶどう", 4)とすることで、新しいキーと値のペアを追加できますし、treeMap.remove("りんご")とすれば、キー「りんご」に対応する値を削除できます。

TreeMapの利点とデメリット

TreeMapの利点は、キーが自動的にソートされることです。これにより、データを検索したり、範囲指定を行う際に効率的に操作できます。

また、Kotlinの標準ライブラリに含まれているため、インポートなどの手間もなく手軽に利用できます。

一方、デメリットとしては、要素の追加や削除に多少のコストがかかる点です。TreeMapは内部的に二分探索木を利用しているため、挿入や削除の際に計算量がO(log n)となります。

そのため、非常に大量のデータを扱う際には他のマップ(たとえばHashMap)の方がパフォーマンスが良い場合があります。

まとめ

KotlinのTreeMapは、キーの順序に基づいてデータを管理するために便利なコレクションです。

自動的にソートされたデータが必要な場合や、特定の範囲のデータを効率的に取得したいときに役立ちます。

ただし、要素の追加や削除の際に若干のコストがかかるため、用途に応じて使い分けることが重要です。

TreeMapを活用して、順序が重要なデータを効率的に管理しましょう。




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

HashMapTreeMapの違いを理解するため、生徒の名前と点数を管理するプログラムを作成しましょう。

3人の生徒の名前と点数を入力し、それぞれのマップに格納します。その後それぞれのマップの内容を表示しましょう。

この問題の要件

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

  • Kotlinの標準入力を使って3人の生徒の名前と点数を入力すること。
  • 入力されたデータをHashMapに格納すること。
  • HashMapのデータをTreeMapにコピーすること。
  • HashMapの内容を入力された順序で表示すること。
  • TreeMapの内容を名前のアルファベット順に表示すること。
  • 表示する際には、「生徒の名前は○○、点数は○○点です。」という形式で表示すること。

ただし、以下のような実行結果となること。

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

生徒の名前を入力してください: Alice
Alice の点数を入力してください: 85
生徒の名前を入力してください: Bob
Bob の点数を入力してください: 92
生徒の名前を入力してください: Charlie
Charlie の点数を入力してください: 78

HashMapを使って入力順に記載:
Alice の点数は 85 点です。
Bob の点数は 92 点です。
Charlie の点数は 78 点です。

TreeMapを使って名前のアルファベット順に記載:
Alice の点数は 85 点です。
Bob の点数は 92 点です。
Charlie の点数は 78 点です。

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

この問題を解くヒント

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

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

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

1.main関数の定義
 1-1. HashMapの作成
 1-2. repeat関数を使った繰り返し処理
  1-2-1. 生徒の名前を標準入力から取得
  1-2-2. 生徒の点数を標準入力から取得
  1-2-3. HashMapに名前と点数を格納
 1-3. TreeMapの作成
 1-4. TreeMapにHashMapの内容をコピー
 1-5. HashMapの内容を表示するためのprintMap関数の呼び出し
 1-6. TreeMapの内容を表示するためのprintMap関数の呼び出し

2.printMap関数の定義
 2-1. Mapの内容をループで表示

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

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

fun main() {
    // 生徒の名前と点数を格納するHashMapを作成
    val studentHashMap = /* ***ここにHashMapを初期化するコードを書く*** */

    // 3人の生徒の情報を入力してもらう
    repeat(3) {
        print("生徒の名前を入力してください: ")
        val name = readLine() ?: ""
        print("$name の点数を入力してください: ")
        val score = readLine()?.toIntOrNull() ?: 0
        studentHashMap[name] = score
    }

    // 生徒の名前と点数を格納するTreeMapを作成
    val studentTreeMap = /* ***ここにTreeMapを初期化するコードを書く*** */
    /* ***ここにHashMapの内容をTreeMapにコピーするコードを書く*** */

    // HashMapの内容を表示
    println("HashMapを使って入力順に記載:")
    /* ***ここにHashMapの内容を表示するコードを書く*** */

    // TreeMapの内容を表示
    println("TreeMapを使って名前のアルファベット順に記載:")
    /* ***ここにTreeMapの内容を表示するコードを書く*** */
}

// Mapの内容を表示する関数
fun printMap(map: Map<String, Int>) {
    for ((name, score) in map) {
        println("$name の点数は $score 点です。")
    }
}

 

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

解答例

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

正解コードの例

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

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

fun main() {
    // 生徒の名前と点数を格納するHashMapを作成
    val studentHashMap = hashMapOf<String, Int>()

    // 3人の生徒の情報を入力してもらう
    repeat(3) {
        print("生徒の名前を入力してください: ")
        val name = readLine() ?: ""
        print("$name の点数を入力してください: ")
        val score = readLine()?.toIntOrNull() ?: 0
        studentHashMap[name] = score
    }

    // 生徒の名前と点数を格納するTreeMapを作成
    val studentTreeMap = sortedMapOf<String, Int>()
    studentTreeMap.putAll(studentHashMap)

    // HashMapの内容を表示
    println("HashMapを使って入力順に記載:")
    printMap(studentHashMap)

    // TreeMapの内容を表示
    println("TreeMapを使って名前のアルファベット順に記載:")
    printMap(studentTreeMap)
}

// Mapの内容を表示する関数
fun printMap(map: Map<String, Int>) {
    for ((name, score) in map) {
        println("$name の点数は $score 点です。")
    }
}

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

コードの解説

このコードは、ユーザーが3人の生徒の名前と点数を入力し、それらを「入力順」と「名前のアルファベット順」で表示するプログラムです。

コードの各部分を順に解説します。

メイン関数の開始

fun main() {
    // 生徒の名前と点数を格納するHashMapを作成
    val studentHashMap = hashMapOf<String, Int>()

ここで、main()関数がプログラムのエントリーポイントとして定義されます。この関数内で、生徒の名前と点数を格納するためのHashMapが作成されています。

HashMapはキーと値のペアを格納するデータ構造で、今回はキーに生徒の名前(String型)、値にその生徒の点数(Int型)を設定しています。

生徒情報の入力

    // 3人の生徒の情報を入力してもらう
    repeat(3) {
        print("生徒の名前を入力してください: ")
        val name = readLine() ?: ""
        print("$name の点数を入力してください: ")
        val score = readLine()?.toIntOrNull() ?: 0
        studentHashMap[name] = score
    }

repeat(3)によって、3回ループが実行され、生徒の名前と点数を入力します。

readLine()で入力を受け取り、toIntOrNull()を使って、入力された文字列を整数に変換しています。

この部分では、3人分の生徒情報がstudentHashMapに格納されます。

TreeMapの作成

    // 生徒の名前と点数を格納するTreeMapを作成
    val studentTreeMap = sortedMapOf<String, Int>()
    studentTreeMap.putAll(studentHashMap)

TreeMapは、キー(ここでは生徒の名前)を自動的にアルファベット順にソートして格納するデータ構造です。

ここでは、studentHashMapの内容をputAllTreeMapにコピーしています。これにより、生徒情報が名前順に並び替えられます。

HashMapとTreeMapの内容表示

    // HashMapの内容を表示
    println("HashMapを使って入力順に記載:")
    printMap(studentHashMap)

    // TreeMapの内容を表示
    println("TreeMapを使って名前のアルファベット順に記載:")
    printMap(studentTreeMap)

最初に、HashMapの内容が「入力順」で表示され、次にTreeMapを使って「名前のアルファベット順」に内容が表示されます。

printMapという関数を使って、それぞれのマップの中身を見やすく表示しています。

printMap関数の解説

fun printMap(map: Map<String, Int>) {
    for ((name, score) in map) {
        println("$name の点数は $score 点です。")
    }
}

printMapは、受け取ったマップ(HashMapTreeMap)の内容をループで回して表示する関数です。

nameは生徒の名前、scoreはその生徒の点数を表しています。

for ((name, score) in map)という書き方で、マップ内のキーと値のペアを取り出していることに注目しましょう。

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

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

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

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






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