Scala:有没有像在Java中一样使用PriorityQueue的方法?

Scala:有没有像在Java中一样使用PriorityQueue的方法?,scala,priority-queue,comparator,Scala,Priority Queue,Comparator,我想在scala.collection.mutable.PriorityQueue中使用一个类,但我不想为了这一目的而将其排序为[a]。我不认为我想使用PrimeRealQueor的排序作为类的自然排序。 class MyObject (sequence: Int, values: List[String]) ... 因此,在我的PriorityQueue中,我希望值按“序列”排序。然而,仅仅因为两个对象具有相同的序列并不能使它们自然相等,因为它们的“值”的内容可能不同 在Java中,这就是能

我想在scala.collection.mutable.PriorityQueue中使用一个类,但我不想为了这一目的而将其排序为[a]。我不认为我想使用PrimeRealQueor的排序作为类的自然排序。
class MyObject (sequence: Int, values: List[String]) ...
因此,在我的PriorityQueue中,我希望值按“序列”排序。然而,仅仅因为两个对象具有相同的序列并不能使它们自然相等,因为它们的“值”的内容可能不同

在Java中,这就是能够向PriorityQueue提供备用比较器对象的地方。我的比较器只是根据对象的“序列”对对象进行排序,而忽略它们的“值”


PriorityQueue类必须用“a参数化。a到有序[a]的转换函数可以扮演Java comparator的角色。该函数需要仅在创建PriorityQueue的范围内可见,因此它不会成为对象的“自然顺序”。

语法

class PriorityQueue[A <% Ordered[A]] ...
这意味着您可以编写自己的方法A=>Ordered[A]

class PriorityQueue[A <% Ordered[A]] extends ... 
case class Foo(n: Int)
def orderedFoo(f: Foo): Ordered[Foo] = new Ordered[Foo] {
  def compare(other: Foo) = f.n.compare(other.n)
}
并手动将其传递到PriorityQueue构造函数中

new PriorityQueue[Foo]()(orderedFoo)
将此答案之前的两个(正确)答案组合成可编译代码:

object o {
  case class Foo(n: Int)
  implicit def orderedFoo(f: Foo): Ordered[Foo] = new Ordered[Foo] {
    def compare(other: Foo) = f.n.compare(other.n)
  }

  val x = new scala.collection.mutable.PriorityQueue[Foo]()
}

他的示例不会为您编译,只是因为(我猜想)您将它按原样扔给了编译器。您不能在scala中编译顶级方法,一切都必须在对象中。

在scala 2.8.0中,优先级队列更改为

class  PriorityQueue[A](implicit ord : Ordering[A]) 
Scala中的排序[A]类似于Java中的Comparator

class  PriorityQueue[A](implicit ord : Ordering[A])