0Pricing
Kotlin Academy · レッスン

コレクションとMapキーで使うData Class

構造的等価性を活用し、data classを集合やマップで使用します。

「コレクションとMapキーで使うData Class」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

値オブジェクトとしてのデータクラス

データクラスは equals と hashCode を構造的にオーバーライドするため、通常のクラスとは異なり、セットやマップのキーとして完全に機能します。

通常のクラス:不適切なマップキー

通常のクラスは、デフォルトでは参照の同一性で比較されます。見た目が同じ2つのオブジェクトでも、異なるマップキーになります。
class Key(val id: Int)  // no equals/hashCode
val map = mutableMapOf<Key, String>()
val k1 = Key(1)
val k2 = Key(1)  // same id, different object
map[k1] = "value"
println(map[k2])  // null! k2 != k1 by reference

データクラス:正しいマップキー

データクラスは構造的等価性を使用します。同じプロパティを持つ2つのオブジェクトは等しいと判定されます。
data class Key(val id: Int)
val map = mutableMapOf<Key, String>()
val k1 = Key(1)
val k2 = Key(1)
map[k1] = "value"
println(map[k2])  // "value"! Equal by value

セット内のデータクラス

セットは equals と hashCode を使って重複を排除します。データクラスは正しく重複排除されます。
data class Tag(val name: String)
val tags = mutableSetOf<Tag>()
tags.add(Tag("kotlin"))
tags.add(Tag("kotlin"))  // duplicate
tags.add(Tag("java"))
println(tags.size)  // 2 (not 3)

データクラスで groupBy

データクラスをキーとしてコレクションをグループ化します。
data class Category(val name: String, val parent: String)
val items = listOf(
    "List" to Category("Collections", "stdlib"),
    "Map" to Category("Collections", "stdlib"),
    "Flow" to Category("Coroutines", "kotlinx")
)
val grouped = items.groupBy { it.second }
println(grouped.keys.size)  // 2

Map による出現回数のカウント

データクラスをマップのキーとして使用し、構造化データの出現回数を数えます。
data class Pair2(val x: Int, val y: Int)
val points = listOf(Pair2(1,2), Pair2(1,2), Pair2(3,4))
val counts = points.groupingBy { it }.eachCount()
println(counts)  // {Pair2(x=1, y=2)=2, Pair2(x=3, y=4)=1}

ネストしたデータクラス

データクラスには他のデータクラスを含めることができます。ネストしたデータクラスでは、equals と hashCode は内部の値まで比較します。
data class Address(val city: String, val country: String)
data class Person(val name: String, val address: Address)
val p1 = Person("Alice", Address("Berlin", "DE"))
val p2 = Person("Alice", Address("Berlin", "DE"))
println(p1 == p2)  // true

データクラスで sortedBy

データクラスのインスタンスのリストを、プロパティに基づいて並べ替えます。
data class Student(val name: String, val grade: Double)
val students = listOf(
    Student("Bob", 3.2),
    Student("Alice", 3.8),
    Student("Charlie", 2.9)
)
println(students.sortedBy { it.grade })

データクラスとキャッシュ

キャッシュキーが複合的な場合は、HashMap のキャッシュキーとしてデータクラスを使用します。
data class CacheKey(val userId: Long, val resourceType: String)
val cache = HashMap<CacheKey, ByteArray>()
val key = CacheKey(42, "avatar")
cache[key] = byteArrayOf(1, 2, 3)
println(cache[CacheKey(42, "avatar")] != null)  // true

データクラスで distinct

データクラスのリストに対する distinct()は、それらの equals を使って重複を削除します。
data class Event(val type: String, val ts: Long)
val events = listOf(
    Event("click", 1000),
    Event("click", 1000),  // duplicate
    Event("scroll", 2000)
)
println(events.distinct().size)  // 2

イミュータブルなキーはより安全

マップやセットのキーには、必ず val プロパティを持つデータクラスを使用してください。挿入後にキーを変更すると、データ構造が壊れます。
data class ImmutableKey(val id: Int)  // val properties only
// DON'T: data class MutableKey(var id: Int)  // changing id breaks map!

クイックチェック

通常のクラスではうまくいかないことが多いのに、データクラスが Map のキーとして正しく機能するのはなぜですか?

まとめ

データクラスは、正しい構造的 equals/hashCode を持つため、Map のキーや Set の要素として機能します。キーをイミュータブルに保つには、val プロパティを使用してください。データクラスに対して groupBy、distinct、sortedBy を活用すると、強力なクエリを実行できます。

よくある質問

「コレクションとMapキーで使うData Class」レッスンは無料ですか?

はい。「コレクションとMapキーで使うData Class」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「コレクションとMapキーで使うData Class」で何を学びますか?

構造的等価性を活用し、data classを集合やマップで使用します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「コレクションとMapキーで使うData Class」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Data Classの基本:自動生成されるメソッド
  2. copy()と部分的なオーバーライドによるコピー
  3. componentNによる分割代入宣言
  4. コレクションとMapキーで使うData Class
← Kotlin Academyに戻る