【问题标题】:Scala: Is there a way to use PriorityQueue like I would in Java?Scala:有没有办法像在 Java 中一样使用 PriorityQueue?
【发布时间】:2010-10-21 19:33:03
【问题描述】:

我有一个想在 scala.collection.mutable.PriorityQueue 中使用的类,但我不想仅仅为了这个目的而将其设为 Ordered[A]。我不认为我想对 PriorityQueue 使用的排序作为类的自然排序。

class MyObject (sequence: Int, values: List[String]) ...

因此,在我的 PriorityQueue 中,我希望这些值按“序列”排序。但是,仅仅因为两个对象具有相同的序列并不能使它们自然相等,因为它们的“值”的内容可能不同。

这就是在 Java 中能够为 PriorityQueue 提供替代 Comparator 对象的地方。我的比较器会简单地根据对象的“序列”对对象进行排序,而忽略它们的“值”。

PriorityQueue 类必须用“A

class PriorityQueue[A <% Ordered[A]] extends ... 

根据我的阅读,这意味着我的类必须扩展 Ordered[A] 或者我必须提供到 Ordered[A] 的“隐式 def”类型转换,老实说,这感觉不优雅。

Java 解决方案似乎更“实用”,允许我传递类似 Comparator 函数的对象,而不是强迫我进入类层次结构或猴子修补我的类。

我意识到使用 PrioirityQueue 有其他替代方法,但我觉得我可能会在 Scala 学习曲线上遇到困难,并且不想在没有充分探索这个设计决策的情况下放弃。

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

谢谢

【问题讨论】:

    标签: scala priority-queue comparator


    【解决方案1】:

    语法

    class PriorityQueue[A <% Ordered[A]] ...
    

    真的只是在上面加了一点糖

    class PriorityQueue[A]()(implicit convert: A => Ordered[A]) ...
    

    这意味着您可以编写自己的方法 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)
    }
    

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

    new PriorityQueue[Foo]()(orderedFoo)
    

    【讨论】:

      【解决方案2】:

      A到Ordered[A]的转换函数可以起到Java比较器的作用。该函数只需要在您创建 PriorityQueue 的范围内可见,因此它不会成为您的对象的“自然排序”。

      【讨论】:

        【解决方案3】:

        将这之前的两个(正确)答案组合成可编译的代码:

        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 中编译顶级方法,一切都必须在一个对象中。

        【讨论】:

          【解决方案4】:

          在 scala 2.8.0 中,PriorityQueue 更改为

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

          Scala 中的 Ordering[A] 类似于 Java 中的 Comparator

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-13
            • 2017-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多