2016-09-06 3 views
0

У меня есть этот случай класс:очереди приоритета с настраиваемым заказом

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)

Что мне нужно изменить?

ответ

2

Как и другие намекал без особого объяснения, проблема вашей функция сравнения:

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

Это соответствует естественному порядку для чисел, где -1 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) 

Что это делает: «создать заказ для объявления сортировкой процентной ставки в обратном направлении».

Мне нравится второй вариант лучше, потому что он обеспечивает лучшую детализацию и позволяет при необходимости использовать несколько порядков.

 Смежные вопросы

  • Нет связанных вопросов^_^