mutable.PriorityQueue 为具有更多属性的 class 自定义排序

mutable.PriorityQueue custom ordering for a class with more attributes

所以我有类似的东西:

class MyClass(val flag: Boolean, val value1: Double, val value2: Double)

我想要一个可变的 PriorityQueue,其中 MyClass 类型的对象根据自定义顺序排序,例如:

// I will only ever compare things with the same flag
def compare(this: MyClass, that: MyClass) = {
    val temp = this.value1 compare that.value1
    if(this.flag) temp = -temp // reversing the order of value1
    if(temp != 0) temp else this.value2 compare that.value2
}

换句话说,每个对象都有一个标志,我想根据 value1 进行排序。如果 value1 在两个对象中都相等,那么我只关心 value2。

然后我想要像

这样的东西
val queue = new PriorityQueue[MyClass](...?

谢谢:)


测试用例 1:

  val queue = mutable.PriorityQueue[Order]()(Ordering.by{ord => (ord.price, ord.timestamp)})

  val o1 = new Order(13, 3, idleStatus)
  val o2 = new Order(11, 1, idleStatus)
  val o3 = new Order(12, 2, idleStatus)
  val o4 = new Order(15, 5, idleStatus)
  val o5 = new Order(14, 4, idleStatus)

  println(queue)
  queue.enqueue(o1)
  queue.enqueue(o2)
  queue.enqueue(o3)
  queue.enqueue(o4)
  queue.enqueue(o5)
  println(queue)

打印以下内容:

PriorityQueue()
PriorityQueue((15, 5), (14, 4), (12, 2), (11, 1), (13, 3))

错了

看来这就是您所需要的。

val queue = mutable.PriorityQueue[MyClass]()(Ordering.by{mc =>
  if (mc.flag) (-mc.value1,mc.value2) else (mc.value1,mc.value2)
})