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)
})
所以我有类似的东西:
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)
})