2015-06-17 3 views
1

я определил приоритет очереди как такКак подать заявку на очередность приоритетов Scala?

import scala.collection.mutable.PriorityQueue 
... 
val queue = new PriorityQueue[(Int,Int)]() 

Я хочу использовать этот порядок:

Если мы сравниваем два пункта А и В в очереди, А больше, чем В, если первый элемент его (Int,Int) tuple is больше чем B. Если они одинаковы, то A больше, чем B, если второй элемент его кортежа (Int,Int) равен меньше, чем B.

Как определить такой порядок?

+0

Добавлен код для OP – user5019849

+0

Упрощенный мой пост, чтобы разобраться в проблеме – user5019849

+0

Кроме того, чтобы ответить на вопросы до редактирования: PriorityQueue не устарел, это только «debrecatedInheritance», поэтому вы не должны «расширять» его, но можете использовать его как обычно. Вы можете добавить элементы с 'queue + = item' или' queue.enqueue (item) ', найти наибольший с' queue.head' и получить + удалить самый большой элемент с 'queue.dequeue()' – Kolmar

ответ

0

Если ваши элементы Int s, самый простой способ определить такой Ordering - это принять отрицательный элемент, который нужно заказать в обратном порядке.

Вы можете создать Заказ, используя методы, предоставляемые объектом Ordering, и передать его на PriotityQueue либо в явном виде:

// I'm using the data format, you have provided originally, before the edit 
val queue = PriorityQueue(
    (1, (2,3), (4,5)), 
    (2, (3,4), (5,6)), 
    (2, (4,5), (6,7)) 
)(Ordering.by { 
    case (fst, (snd, _), (_, _)) => (fst, -snd) 
}) 

или неявно:

implicit val MyOrdering: Ordering[(Int, (Int, Int), (Int, Int))] = 
    Ordering.by { 
    case (fst, (snd, _), (_, _)) => (fst, -snd) 
    } 
val queue = PriorityQueue(
    (1, (2,3), (4,5)), 
    (2, (3,4), (5,6)), 
    (2, (4,5), (6,7))) 
+0

Что означает подразумеваемая вещь? Что все приоритетные очереди неявно упорядочены в соответствии с MyOrdering? Как Scala знает, когда применять неявный порядок и что? – user5019849

+0

Если вы определяете или импортируете неявное в функцию, то это все до конца функции. Если вы определите его в классе, то это будет всюду в этом классе. Но вы все равно можете передавать неявные параметры явно. Также читайте здесь о типах имплицитов и о том, где они могут появиться: http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits – Kolmar

+0

На самом деле часть этого ответа может не работать для меня , Что не так с 'val queue = PriorityQueue [(Int, Int)] (Ordering.by {case (a, b) => (a, -b)})'? Это дает мне ошибку «ошибка: отсутствующий тип параметра для расширенной функции» – user5019849