scala.collection.mutable.PriorityQueue: сравнение с 2 или более атрибутами класса дела - PullRequest
1 голос
/ 31 октября 2019

Этот вопрос Простой идиоматический способ определения порядка для простого класса дел выглядит аналогично, но не одинаково. Этот вопрос больше связан с приоритетной очередью.

import scala.collection.mutable.PriorityQueue

  case class Task(prio: Int, text: String, jobPriority:Int)
    extends Ordered[Task] {
    def compare(that: Task) = that.prio compare this.prio
   // def compare(x: Task, y: Task) = y.prio compare this.prio //&&  y.jobPriority compare this.jobPriority

  }

  //test
  var q: mutable.PriorityQueue[Task] = PriorityQueue[Task]() ++ Seq(Task(3, "Clear drains",1), Task(4, "Feed cat",2),
    Task(5, "Make tea",9), Task(1, "Solve RC tasks",5), Task(2, "Tax return",5))
  while (q.nonEmpty) println(q dequeue)

дает мне такой вывод:

Task(1,Solve RC tasks,5)
Task(2,Tax return,5)
Task(3,Clear drains,1)
Task(4,Feed cat,2)
Task(5,Make tea,9)

, теперь я также хочу учитывать jobPriority при проведении сравнения. так же, как пользовательский компаратор Java, который сравнивает несколько атрибутов.

Есть ли в Scala какой-либо способ добиться этого?

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

сравнение с кортежем:

import scala.collection.mutable.PriorityQueue

  case class Task(prio: Int, text: String, jobPrio: Int)
    extends Ordered[Task] {

    import scala.math.Ordered.orderingToOrdered

    def compare(that: Task) = (that.prio, that.jobPrio) compare(this.prio, this.jobPrio)

  }

  //test
  var q: mutable.PriorityQueue[Task] = PriorityQueue[Task]() ++ Seq(Task(3, "Clear drains", 1), Task(4, "Feed cat", 2),
    Task(5, "Make tea", 9), Task(1, "Solve RC tasks", 5), Task(2, "Tax return", 5))
  while (q.nonEmpty) println(q dequeue)

Результат:

Task(1,Solve RC tasks,5)
Task(2,Tax return,5)
Task(3,Clear drains,1)
Task(4,Feed cat,2)
Task(5,Make tea,9)
2 голосов
/ 31 октября 2019

Вы можете сделать что-то вроде этого:

case class Task(prio: Int, text: String, jobPriority:Int)
    extends Ordered[Task] {
    def prioCompare(that: Task) = that.prio compare this.prio
    def jobPriorityCompare(that: Task) = that.jobPriority compare this.jobPriority
    def compare(that: Task) = {
      val prioC = prioCompare(that)

      if(prioC == 0) jobPriorityCompare(that) else prioC
    }

  }

  //test
  var q: mutable.PriorityQueue[Task] = PriorityQueue[Task]() ++ Seq(Task(3, "Clear drains",6), Task(4, "Feed cat",2),
    Task(5, "Make tea",9), Task(1, "Solve RC tasks",5), Task(3, "Tax return",5))
  while (q.nonEmpty) println(q dequeue)

/* Output
Task(1,Solve RC tasks,5)
Task(3,Tax return,5)
Task(3,Clear drains,6)
Task(4,Feed cat,2)
Task(5,Make tea,9)
*/

...