自定义排序的优先级队列

时间:2016-09-06 07:50:39

标签: scala priority-queue

我有这个案例类:

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)

相反,我想得到:

# queries/mymodel/select.mymodel.sql SELECT * FROM mymodel; // in mymodel.js const fs = require('fs'); const queries = { select: fs.readFileSync(__dirname + '/queries/mymodel/select.mymodel.sql', 'utf8') };

我需要改变什么?

1 个答案:

答案 0 :(得分:3)

正如其他人暗示没有太多解释,问题是你的比较功能:

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

这匹配数字的自然排序,其中-1 <1。 0&lt; 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)

这样做是:“通过反向排序利率来创建优惠订购”。

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