イベントスケジューラー
CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 56/57。
チャレンジ
難しいイベントスケジューラーを作成してください。
Event(title, day, start, end)(0〜24時間)は、日、開始時刻、タイトルの順で並べられるComparable<Event>を実装するクラスです。タイトルと日が一致する場合(同じイベントが2回入力された場合)、2つのイベントは等しいものとみなされるため、これら2つのプロパティに基づいてequalsとhashCodeをオーバーライドしてください。表示形式はday 3 09-11 standupで、時刻は2桁で表示します。同じ日に、一方のイベントの開始時刻がもう一方のイベントの終了時刻より前であり、かつもう一方の開始時刻が最初のイベントの終了時刻より前である場合、overlaps(other)は true になります。Scheduler.add(event)は、イベントが開始後に終了しない場合はinvalid: standup、等しいイベントの場合はduplicate、agendaの順序で最初に重複するイベントがある場合はconflicts with review、それ以外の場合はaddedを返します。agenda()はイベントをソートして返し、busiestDay()は予約時間が最も多い日の場合にbusiest day 3: 5hを返します(同率の場合は早い日)。イベントがない場合はno eventsを返します。
提供されたコードは、イベントを title,day,start,end 形式の行として読み込み、それぞれの返答を出力した後、agenda(1行につき1イベント)と最も忙しい日を出力します。
コードは Event.kt と Scheduler.kt に記述してください。Main.kt には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
fun main() {
// 提供された入出力コード: そのままにしておく
val input = generateSequence(::readLine).toList()
val scheduler = Scheduler()
for (line in input) {
val p = line.split(",")
println(scheduler.add(Event(p[0], p[1].toInt(), p[2].toInt(), p[3].toInt())))
}
for (e in scheduler.agenda()) println(e)
println(scheduler.busiestDay())
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Kotlinプレイグラウンド