比較演算子
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フィードバックを取得できます。ローカル設定は不要です。