Scala:有没有像在Java中一样使用PriorityQueue的方法?
我想在scala.collection.mutable.PriorityQueue中使用一个类,但我不想为了这一目的而将其排序为[a]。我不认为我想使用PrimeRealQueor的排序作为类的自然排序。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中,这就是能
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])