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

Joe*_*way 5 scala priority-queue comparator

我有一个类,我想在scala.collection.mutable.PriorityQueue中使用,但我不想让它为了这个目的而订购[A].我不认为我想要使用的顺序是PriorityQueue作为类的自然顺序.

class MyObject (sequence: Int, values: List[String]) ...
Run Code Online (Sandbox Code Playgroud)

所以,在我的PriorityQueue中,我希望这些值按'sequence'排序.然而,仅仅因为两个对象具有相同的序列并不能使它们自然相等,因为它们的"值"的内容可能不同.

这就是在Java中,能够为PriorityQueue提供备用Comparator对象的好处.我的比较器只是根据它们的"序列"对对象进行排序,并忽略它们的"值".

必须使用"A <%Ordered [A]"参数化PriorityQueue类

class PriorityQueue[A <% Ordered[A]] extends ... 
Run Code Online (Sandbox Code Playgroud)

从我所读到的,这意味着我的班级必须扩展Ordered [A]或者我必须提供一个"隐式def"类型转换为Ordered [A],老实说,它感觉不优雅.

Java解决方案似乎更具"功能性",允许我传递一个类似Comparator函数的对象,而不是强迫我进入类层次结构或monkeypatching我的类.

我意识到有使用PrioirityQueue的替代方案,但我觉得我可能会在这里遇到Scala学习曲线,并且不想在没有完全探索这个设计决策的情况下放弃.

这只是Scala库中的一个不幸的决定,还是我误解了某种调用约定,使PriorityQueue更具可用性和"功能性"?

谢谢

Jor*_*tiz 9

语法

class PriorityQueue[A <% Ordered[A]] ...
Run Code Online (Sandbox Code Playgroud)

真的只是一个轻微的糖果

class PriorityQueue[A]()(implicit convert: A => Ordered[A]) ...
Run Code Online (Sandbox Code Playgroud)

这意味着你可以编写自己的方法A => Ordered [A]

case class Foo(n: Int)
def orderedFoo(f: Foo): Ordered[Foo] = new Ordered[Foo] {
  def compare(other: Foo) = f.n.compare(other.n)
}
Run Code Online (Sandbox Code Playgroud)

并手动将其传递给您的PriorityQueue构造函数

new PriorityQueue[Foo]()(orderedFoo)
Run Code Online (Sandbox Code Playgroud)