0Pricing
Kotlin Academy · レッスン

比較演算子

compareToとequalsを学びます

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

カスタム型の比較

独自の型で <、>、<=、>= を使うには、Int を返す operator fun compareTo を定義します。

data class Money(val cents: Int) {
    operator fun compareTo(o: Money) = cents - o.cents
}

fun main() {
    println(Money(500) > Money(200))
}

compareTo の契約

compareTo は、レシーバーが小さい場合は負の数、等しい場合は0、大きい場合は正の数を返します。

data class Version(val n: Int) {
    operator fun compareTo(o: Version) = n - o.n
}

fun main() {
    println(Version(2).compareTo(Version(5)))
}

Comparable の実装

Comparable<T> インターフェースを実装するのが慣用的な方法です。その compareTo はすでに演算子になっています。

data class Score(val value: Int) : Comparable<Score> {
    override fun compareTo(other: Score) = value - other.value
}

fun main() {
    println(Score(10) < Score(20))
}

Comparable を使ったソート

型が Comparable になると、sorted() のようなコレクション関数が自動的に動作します。

data class Player(val rank: Int) : Comparable<Player> {
    override fun compareTo(other: Player) = rank - other.rank
}

fun main() {
    val sorted = listOf(Player(3), Player(1), Player(2)).sorted()
    println(sorted.map { it.rank })
}

compareValuesBy の使用

複数のフィールドを比較する場合、compareValuesBy は各セレクターの順に比較します。

data class Person(val age: Int, val name: String) : Comparable<Person> {
    override fun compareTo(other: Person) =
        compareValuesBy(this, other, { it.age }, { it.name })
}

fun main() {
    println(Person(30, "Al") < Person(30, "Bo"))
}

equals による等価性

== 演算子は compareTo ではなく equals を呼び出します。値の等価性を制御するには equals をオーバーライドします。

class Id(val value: Int) {
    override fun equals(other: Any?) =
        other is Id && other.value == value
    override fun hashCode() = value
}

fun main() {
    println(Id(7) == Id(7))
}

equals と hashCode の組み合わせ

equals をオーバーライドする場合は、等しいオブジェクトが同じハッシュ値を共有するように hashCode もオーバーライドする必要があります。これにより、ハッシュベースのコレクションが正しく動作します。

class Tag(val name: String) {
    override fun equals(other: Any?) = other is Tag && other.name == name
    override fun hashCode() = name.hashCode()
}

fun main() {
    val set = hashSetOf(Tag("a"), Tag("a"))
    println(set.size)
}

データクラスが自動的に処理

data class はプロパティから equals と hashCode を自動生成するため、== は値を比較します。

data class Coord(val x: Int, val y: Int)

fun main() {
    println(Coord(1, 2) == Coord(1, 2))
}

等価性と同一性

== は equals を呼び出して値の等価性を確認し、=== は参照の同一性を確認します。両者の結果は異なる場合があります。

data class Box(val n: Int)

fun main() {
    val a = Box(1)
    val b = Box(1)
    println(a == b)
    println(a === b)
}

条件式での比較

compareTo を定義すると、数値と同じように、独自の型を if や when で使用できます。

data class Weight(val g: Int) : Comparable<Weight> {
    override fun compareTo(other: Weight) = g - other.g
}

fun main() {
    val w = Weight(50)
    println(if (w > Weight(40)) "heavy" else "light")
}

maxOf と minOf

Comparable 型は maxOf と minOf で使用できます。

data class T(val v: Int) : Comparable<T> {
    override fun compareTo(other: T) = v - other.v
}

fun main() {
    println(maxOf(T(3), T(8)).v)
}

理解度チェック

比較演算子についての理解度を確認してください。

おさらい

比較演算子について学びました。

  • compareTo は <、>、<=、>= を実装し、負の数、0、正の数を返します。
  • 慣用的な順序付けとソートには Comparable<T> を実装します。
  • == は equals を使用するため、常に hashCode と組み合わせます。
  • データクラスは equals と hashCode を自動的に生成します。
data class S(val v: Int) : Comparable<S> {
    override fun compareTo(other: S) = v - other.v
}

fun main() {
    println(S(2) < S(5))
}

よくある質問

「比較演算子」レッスンは無料ですか?

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

「比較演算子」で何を学びますか?

compareToとequalsを学びます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「比較演算子」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 演算子関数
  2. 比較演算子
  3. インデックスとInvoke
  4. ベストプラクティス
← Kotlin Academyに戻る