如何在TreeMap中使用Scala的Ordering#reverse?

时间:2010-12-25 22:25:20

标签: scala map tree

Scala的Ordering特征有一个方法reverse,这似乎是获得TreeMap“错误”排序方式的“官方”方法。

该特征的片段如下所示:

trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
  outer =>

  override def reverse: Ordering[T] = new Ordering[T]{
    override def reverse = outer
    def compare(x: T, y: T) = outer.compare(y, x)
  }
  /*snip*/
}

我认为它可以与Java的Collections.reverseOrder相媲美,但Ordering.reverse当然不起作用。

如何使用TreeMap的反向排序,例如: G:

new TreeMap[Foo, Bar](/*???*/)

3 个答案:

答案 0 :(得分:7)

new TreeMap[Foo, Bar]()(implicitly[Ordering[Foo]].reverse)

当然,假设Ordering[Foo]隐式可用(例如Ordering[Int]Ordering[String])。如果您将其定义为object X,则只需传递X.reverse

请注意,此处的第一组括号必须为空 - 它只是在此特定情况下接收隐式参数的第二组括号。

答案 1 :(得分:2)

new TreeMap[Foo,Bar]()(Ordering[Foo].reverse)

也有效。太好了!简洁而没有implicitly魔法。

如果我没弄错的话,这里真的发生了什么:

  • Odering[Foo]调用Ordering.apply,它有一个隐含参数(本身就是Ordering类型)
  • 找到该参数的隐式def Ordering.ordered(我不知道为什么)并创建一个新的Ordering对象
  • Ordering对象传递给Ordering.apply
  • 并返回 在reverse对象上调用
  • Ordering并创建另一个新的Ordering对象

我在这里混合了运行时和编译时的术语,但你会发现我的漂移。

答案 2 :(得分:1)

如果new TreeMap[Foo,Bar]()(Ordering.ordered[Foo].reverse)没有对象,

Ordering[Foo]应该有效,只要Foo extends Ordered[Foo](或更一般地Foo extends Comparable[Foo])。