【Kotlin練習問題】演算子のオーバーロード:比較演算子

演算子のオーバーロードとは

Kotlinでは型に事前に定義されている演算子のセットに対して独自の実装を施すことができます。

これらの演算子には前もって定義された記号(+や*など)があり、優先順位も決まっています。演算子を実装するには、対応する型用の特定の名前をもつメンバ関数、または拡張関数を用意します。

例えばa.unaryMinus()という関数は-aという式に対応しており、以下のコードのようにPoint.unaryMinus()をオーバーロードしておけば、-Pointが実際にはオーバーロードされたPoint.unaryMinus()として機能するようになります。

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

operator fun Point.unaryMinus() = Point(-x, -y)

val point = Point(10, 20)

fun main() {
   println(-point)  // "Point(x=-10, y=-20)"
}

それぞれの演算子に対して対応する関数があるので、必要に応じて公式リファレンスで確認してください。

演算子をオーバーロードするにはoperator修飾子を使って対応する関数をマーキングします。

interface IndexedContainer {
    operator fun get(index: Int)
}

また演算子のオーバーロードをオーバーライドする際には、operator修飾子を省くことができます。

class OrdersList: IndexedContainer {
    override fun get(index: Int) { /*...*/ }
}

問題

MyDateクラスにcompareTo関数を追加し、MyDateクラスを比較できるようにしてください。

date1 < date2がエラー無くコンパイルできるようにしましょう。

data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) : Comparable<MyDate> {
    /* TODO */
}

fun test(date1: MyDate, date2: MyDate) {
    // this code should compile:
    println(date1 < date2)
}
[expander_maker id=”1″ more=”ヒント” less=”非表示”]

ヒント

date1 < date2は実際にはコンパイラによって、date1.compareTo(date2) < 0と解釈されます。

ですので、MyDateクラスの中でcompareTo関数をオーバーライドし、MyDateクラスのパラメーターに渡されたInt型のyear、month、dayOfMonthとcompareToに渡されたMyData型のyear、month、dayOfMonthとを比較できるようにしましょう。

[/expander_maker] [expander_maker id=”1″ more=”答え” less=”非表示”]

答え

data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) : Comparable<MyDate> {
    override fun compareTo(other: MyDate) = when {
        year != other.year -> year - other.year
        month != other.month -> month - other.month
        else -> dayOfMonth - other.dayOfMonth
    }
}

fun test(date1: MyDate, date2: MyDate) {
    // this code should compile:
    println(date1 < date2)
}

[解説]

when式の中で、yearが異なればyearからother.yearを引いた値を返すようにしています。

yearの値とother.yearの値が同じ場合はmonthを…という形で同様にdayOfMonthまで比較させています。

もしdate1.year < date2.yearであれば、date1.compareTo(date2)で返ってくる値は負(<0)になるので、date1.compareTo(date2) < 0はtrueを返すようになります。従って、date1 < date2もtrueになります。

[/expander_maker]

その他の問題はこちらからどうぞ。

完全無料で通えるプログラミングスクール

プログラミング学習はどうしても一人だとつまづいてしまう時がきます。調べればわかることも少なくないですが、最初のうちは調べ方もわからないことが多いため、あまり効率的ではありません。

効率的かつ挫折せずにプログラミングを学習したい方はスクールを検討してみるのも一つの手です。

中には無料で通えるスクールや、就職保証をしてくれるスクールなどもあるので、きっとあなたの目的に応じて最適のスクールが見つかります!以下の記事で評判がよく特におすすめのスクールをいくつかピックアップしているので、スクール選びで後悔したくない方は御覧ください!

https://codelabsjp.net/best-programming-school/

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

[itemlink post_id=”1743″]

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

[itemlink post_id=”1745″]