我有这个案例课:
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)
我需要更改什么?
正如其他人暗示的那样,没有太多解释,问题出在您的比较功能上:
def compare(that: Offer) = this.interestRate.compareTo(that.interestRate)
这与-1 <0 <1的数字的自然顺序匹配。
在Scala中创建优先级队列时,它将使用Ordering
从Order
您定义的隐式派生的。您所缺少的是,优先级队列会将“较高”的值视为具有最高优先级(基本上按降序排列)。
最简单的解决方法是将compare
函数更改为其反函数:
def compare(that: Offer) = that.interestRate.compareTo(this.interestRate)
需要注意的反转that
和this
。
另一种选择是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)
它的作用是:“通过对利率进行反向排序来创建要约的订单”。
我更喜欢第二个选项,因为它提供了更好的粒度,并允许在必要时使用多个排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句