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](/*???*/)
答案 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类型)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]
)。