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

Posted

技术标签:

【中文标题】mutable.PriorityQueue 为具有更多属性的类自定义排序【英文标题】:mutable.PriorityQueue custom ordering for a class with more attributes 【发布时间】:2020-12-03 09:57:01 【问题描述】:

所以我有类似的东西:

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.byord => (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))

错了

【问题讨论】:

您不能使用println() 来评估PriorityQueue。来自ScalaDocs page:“只有dequeuedequeueAll方法会按优先级顺序返回元素...”和之后的“因此,打印PriorityQueue不会显示优先级元素的顺序..." @jwvh 哦不知道。现在它工作正常。谢谢! 【参考方案1】:

看起来也许这就是你所需要的。

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

【讨论】:

以上是关于mutable.PriorityQueue 为具有更多属性的类自定义排序的主要内容,如果未能解决你的问题,请参考以下文章

Scala - PriorityQueue 的订购失败

在我的算法中替换命令式 PriorityQueue

scala优先级队列没有正确排序?

在 Scala 中创建最小堆的最简单和最有效的方法是啥?

如何将具有 Decimal 的 spark DataFrame 转换为具有相同精度的 BigDecimal 的 Dataset?

MDX:如何将具有多个成员的元组转换为具有单个成员的元组?