Android
 Computer >> コンピューター >  >> プログラミング >> Android

KotlinでHashMap(ハッシュマップ)を反復処理する3つの方法を徹底解説

Map(マップ)とは、データを「キーと値」のペアとして格納するコレクションであり、各キーは一意である必要があります。KotlinのHashMapは、MutableMapインターフェースに基づくコレクションクラスで、HashTableの仕組みを利用して実装されています。Kotlinでは、HashMapを定義・操作するために4種類のコンストラクタが用意されています。

  • HashMap() – デフォルトのコンストラクタです。空のHashMapを作成します。

  • HashMap(initialCapacity: Int) – 指定した初期容量を持つHashMapを作成します。

  • HashMap(initialCapacity: Int, loadFactor: Float = 0f) – 初期容量と負荷係数を指定してHashMapを作成します。引数が省略された場合はデフォルトの動作になります。

  • HashMap(original: Map<out K, V>) – 指定したMapの内容をもとに、新しいHashMapインスタンスを作成します。

この記事では、HashMap()コンストラクタを使ってHashMapを作成し、put()メソッドでキーと値のデータを登録します。例として、「科目名」とその「優先度(好みの番号)」を保持するコレクションを作成し、Kotlin標準ライブラリが提供するさまざまな方法でこのHashMapを反復処理(イテレーション)していきます。

forループを使った反復処理

多くのプログラミング言語と同様に、Kotlinでもforループを使ってコレクションを走査できます。次の例では、forループでMapの要素を1つずつ取り出しています。分解宣言(Destructuring Declaration)を使うことで、キーと値を同時に受け取れるのがポイントです。

サンプルコード

fun main(args: Array<String>) {
   // HashMapの宣言
   var subject : HashMap<String, Int>
      = HashMap<String, Int> ();

   // HashMapへの値の代入
   subject.put("Java" , 1);
   subject.put("Kotlin" , 2);
   subject.put("Python" , 3);
   subject.put("C++" , 4);
   subject.put("SQL" , 5);

   // forループによる反復処理
   println("---------iterate using for Loop------------\n")
   for ((k, v) in subject) {
      println(" Subject Name -> $k and its preference -> $v")
   }
   println("\n\n")
}

実行結果

このコードを実行すると、次のような出力が得られます。

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar

---------iterate using for Loop------------
Subject Name -> Java and its preference -> 1
Subject Name -> C++ and its preference -> 4
Subject Name -> Kotlin and its preference -> 2
Subject Name -> Python and its preference -> 3
Subject Name -> SQL and its preference -> 5

なお、HashMapは要素の順序を保証しないため、出力順序は挿入順とは異なる場合があります。

forEach()を使った反復処理

forループ以外にも、forEach()メソッドを使ってコレクションを走査できます。forEach()ではラムダ式の中でキーと値を受け取り、簡潔に処理を記述できます。次の例では、forEach()を使ってMapを反復処理しています。

サンプルコード

fun main(args: Array<String>) {
   // HashMapの宣言
   var subject : HashMap<String, Int>
      = HashMap<String, Int> ();

   // HashMapへの値の代入
   subject.put("Java" , 1);
   subject.put("Kotlin" , 2);
   subject.put("Python" , 3);
   subject.put("C++" , 4);
   subject.put("SQL" , 5);

   // forEachによる反復処理
   println("------iterate using forEach Method---------\n")
   subject.forEach { (k, v) ->
      println(" Subject Name -> $k and its preference -> $v")
   }
   println("\n\n")
}

実行結果

このコードを実行すると、次のような出力が得られます。

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar

------iterate using forEach Method---------
Subject Name -> Java and its preference -> 1
Subject Name -> C++ and its preference -> 4
Subject Name -> Kotlin and its preference -> 2
Subject Name -> Python and its preference -> 3
Subject Name -> SQL and its preference -> 5

iterator()メソッドを使った反復処理

上記の一般的な方法に加えて、Kotlin標準ライブラリにはiterator()関数が用意されています。これを使うと、コレクションの内部構造を意識せずに要素へ順番にアクセスできます。大量のデータを扱う場合や、細かい制御が必要な場合に最も効率的なアクセス方法の一つです。次の例では、iterator()メソッドを使ってHashMapを走査しています。

サンプルコード

fun main(args: Array<String>) {
    // HashMapの宣言
    var subject : HashMap<String, Int>
       = HashMap<String, Int> ();

    // HashMapへの値の代入
    subject.put("Java" , 1);
    subject.put("Kotlin" , 2);
    subject.put("Python" , 3);
    subject.put("C++" , 4);
    subject.put("SQL" , 5);

    // iterator()メソッドの使用
    println("-----------Using iterator() Method-----------\n")
    val i = subject.keys.iterator()
    while (i.hasNext()) {
       val key = i.next()
       val value = subject[key]
       println("Subject Name -> ${key} and its preference -> $value")
    }
}

実行結果

このコードを実行すると、次のような出力が得られます。

$kotlinc -nowarn main.kt -include-runtime -d main.jar
$java -Xmx128M -Xms16M -jar main.jar

-----------Using iterator() Method-----------
Subject Name -> Java and its preference -> 1
Subject Name -> C++ and its preference -> 4
Subject Name -> Kotlin and its preference -> 2
Subject Name -> Python and its preference -> 3
Subject Name -> SQL and its preference -> 5

まとめ

KotlinでHashMapを反復処理する主な方法は以下の3つです。

  • forループ:分解宣言によりキーと値を同時に取得でき、最も直感的で読みやすい書き方。

  • forEach():ラムダ式で簡潔に記述でき、関数型スタイルのコードに適している。

  • iterator():hasNext()とnext()で要素を制御しながら走査でき、柔軟で効率的なアクセスが可能。

用途や可読性の要件に応じて、これらの方法を使い分けるとよいでしょう。

  1. Androidアプリ開発:シングルトンパターンでHashMapを保存・管理する方法

    具体的な実装例に入る前に、まずシングルトンデザインパターンについて確認しておきましょう。シングルトンとは、あるクラスのインスタンス化をアプリケーション全体で1つだけに制限するデザインパターンのことです。主な用途としては、同時実行(並行処理)の制御や、データストアへのアクセスポイントをアプリケーション内に一元化することなどが挙げられます。この記事では、AndroidアプリにおいてHashMap(ハッシュマップ)をシングルトンクラスに保存する方法を、ステップごとに解説していきます。手順1:新しいプロジェクトを作成するAndroid Studioを開き、「File」→「New Project」を選択

  2. AndroidでJSON配列を反復処理する方法をステップごとに解説

    この記事では、Androidアプリ開発においてJSON配列(JSONArray)を反復処理する方法を、実際のサンプルコードとともにステップ形式で解説します。org.jsonパッケージのJSONObjectとJSONArrayクラスを使用して、JSON文字列からデータを取り出し、画面に表示するまでの一連の流れを学べます。完成イメージ本チュートリアルでは、従業員情報(ID・名前・給与)を含むJSON文字列を解析し、各要素を順番に読み取ってTextViewに表示するシンプルなアプリを作成します。手順1:Android Studioで新規プロジェクトを作成するまず、Android Studioを起動し