Menu
Coddy logo textTech

סיכום – תור עדיפויות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Kotlin של Coddy. שיעור 41 מתוך 57.

challenge icon

אתגר

בינוני

בנו תור עדיפויות שעובד עם כל סוג שניתן לתעדף. Prioritized (עם priority) ומחלקות הנתונים Job ו-Ticket מסופקים.

  • ל-TaskQueue<T : Prioritized> יש את push(item), pop() ו-peek(), שמסירים או מחזירים את הפריט בעל העדיפות הגבוהה ביותר (מבין פריטים בעלי עדיפות זהה, זה שהוכנס ראשון) או את null, את size, את items() (תמונת מצב לקריאה בלבד לפי סדר ההוצאה) ואת drain(n), שמוציא עד n פריטים ומחזיר אותם בתור List<T>.
  • הפונקציה הגנרית countUrgent(queue, min) מקבלת תור של כל סוג שניתן לתעדף ומחזירה כמה מהפריטים בו הם בעלי עדיפות של לפחות הערך הזה.

הקוד המסופק קורא פקודות job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2 (כרטיסים) או sizes, מדפיס כל תגובה ולבסוף urgent: יחד עם העבודות והכרטיסים הדחופים שעדיין בתור.

הקוד שלכם ייכתב בקבצים TaskQueue.kt, Prioritized.kt, Job.kt ו-Ticket.kt. הקובץ Main.kt מכיל את קוד הקלט/פלט המסופק ואי אפשר לערוך אותו.

נסו בעצמכם

fun main() {
    // קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
    val input = generateSequence(::readLine).toList()
    val jobs = TaskQueue<Job>()
    val tickets = TaskQueue<Ticket>()
    for (cmd in input) {
        val p = cmd.split(" ")
        when (p[0]) {
            "job" -> jobs.push(Job(p[1], p[2].toInt()))
            "ticket" -> tickets.push(Ticket(p[1].toInt(), p[2].toInt(), p[3]))
            "pop" -> println("popped " + (if (p[1] == "jobs") jobs.pop() else tickets.pop()))
            "peek" -> println("next " + (if (p[1] == "jobs") jobs.peek() else tickets.peek()))
            "drain" -> println("drained " + tickets.drain(p[1].toInt()).map { it.customer })
            else -> println("jobs ${jobs.size}, tickets ${tickets.size}")
        }
    }
    println("urgent: ${countUrgent(jobs, 4) + countUrgent(tickets, 4)}")
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Kotlin אונליין