Menu
CoddyTech

Bộ lập lịch sự kiện

Thuộc phần Lập trình hướng đối tượng trong hành trình Kotlin của Coddy. Bài học 56 trên 57.

challenge icon

Thử thách

Khó

Hãy xây dựng bộ lập lịch sự kiện.

  • Event(title, day, start, end) (giờ từ 0 đến 24) là một lớp triển khai Comparable<Event>, được sắp xếp theo ngày, rồi đến giờ bắt đầu, sau đó là tiêu đề. Hai sự kiện bằng nhau khi tiêu đề và ngày của chúng trùng khớp (cùng một sự kiện được nhập hai lần), vì vậy hãy ghi đè equals và hashCode dựa trên hai thuộc tính đó. Sự kiện được in ra theo dạng day 3 09-11 standup, với giờ gồm hai chữ số. overlaps(other) trả về true khi hai sự kiện trong cùng ngày bắt đầu trước giờ kết thúc của sự kiện còn lại.
  • Scheduler.add(event) trả về invalid: standup khi sự kiện không kết thúc sau khi bắt đầu, duplicate nếu là sự kiện bằng nhau, conflicts with review nếu có sự kiện đầu tiên bị chồng lấn theo thứ tự trong lịch, hoặc added.
  • agenda() trả về các sự kiện đã sắp xếp, còn busiestDay() trả về busiest day 3: 5h cho ngày có tổng số giờ được đặt nhiều nhất (nếu bằng nhau thì chọn ngày sớm hơn), hoặc no events.

Code được cung cấp đọc các sự kiện từ những dòng có dạng title,day,start,end, in ra câu trả lời cho từng dòng, sau đó in lịch (mỗi sự kiện trên một dòng) và ngày bận nhất.

Code của bạn nằm trong Event.kt và Scheduler.kt. Main.kt chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

fun main() {
    // Đoạn code đầu vào/đầu ra đã cung cấp: giữ nguyên
    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())
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Kotlin