【问题标题】:Priority queue with custom ordering具有自定义排序的优先队列
【发布时间】:2016-09-06 07:50:39
【问题描述】:

我有这个案例类:

case class Offer(id: Int, amount: Int, interestRate: Double) extends Ordered[Offer] {

  def compare(that: Offer) = interestRate.compareTo(that.interestRate)
}

如您所见,我根据Offer.interestRate 定义了排序。我希望订单增加。

我创建了这些优惠:

Offer(1, 5, 4.0)
Offer(2, 5, 0.5)
Offer(3, 5, 1.5)

并将它们添加到优先级队列中:

val currentOffers: mutable.PriorityQueue[Offer] = mutable.PriorityQueue.empty[Offer]

问题是当我执行currentOffers.dequeue() 时,我得到Offer(1, 5, 4.0)

相反,我想得到:

Offer(2, 5, 0.5)

我需要改变什么?

【问题讨论】:

    标签: scala priority-queue


    【解决方案1】:

    正如其他人没有过多解释的暗示,问题在于您的比较功能:

    def compare(that: Offer) = this.interestRate.compareTo(that.interestRate)
    

    这与 -1

    当您在 Scala 中创建优先级队列时,它使用 Ordering 隐式派生自您定义的 Order。 您缺少的是优先级队列会将“较高”值视为具有最高优先级(基本上它按降序排序)。

    最简单的解决方法是将compare 函数更改为它的反函数:

    def compare(that: Offer) = that.interestRate.compareTo(this.interestRate)
    

    注意thatthis 的倒置。

    另一种选择是在构建队列时提供Ordering

    val q = mutable.PriorityQueue(
      Offer(1, 5, 4.0),
      Offer(2, 5, 0.5),
      Offer(3, 5, 1.5)
    )(Ordering.by[Offer, Double](_.interestRate).reverse)
    

    它的作用是:“通过对利率进行反向排序来创建报价排序”。

    我更喜欢第二个选项,因为它提供了更好的粒度,并允许在必要时使用多个排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多