scala中的派生订单?

时间:2012-11-03 00:28:33

标签: scala

我偶尔会发现自己想要一个非常简单的订购[A]用于尚未订购的类。通常是元组或类的字段的投影。以下类似乎通常会这样做

case object Ord { 
  case class DerivedOrdering[A,B](fn : B=>A)(implicit o : Ordering[A]) extends Ordering[B] { 
      def compare(a:B, b:B) = o.compare(fn(a), fn(b)) 
  }
}

我还没有在scala库中看到它。它在某处吗?

用法

Ord.DerivedOrdering[Int, (Int, List[Int])]( _._1)

按整数排序(Int,List [Int])排序。

2 个答案:

答案 0 :(得分:6)

您可以做的事情是标准库中的方法

def by[T, S](f: T => S)(implicit ord: Ordering[S]): Ordering[T]
例如,您可以执行以下操作:

implicit val tupleOrdering = Ordering.by[(Int, List[Int]), Int] {
  _._1
}

流便

答案 1 :(得分:0)

不是本身,但您可以在通话网站上这样做。而不是说

foo.sorted()

根据您描述的顺序,您可以说

foo.sortBy(_._1)

用你想要的任何投射或更复杂的表达,例如

foo.sortBy(_._1.toLowercase)