2012-11-03 39 views
2

我偶爾發現自己想要一個非常簡單的Ordering [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])排序的排序。

回答

6

也有一些是可以做哪個是標準庫中的一種方法

def by[T, S](f: T => S)(implicit ord: Ordering[S]): Ordering[T] 

例如,你可以做到以下幾點:

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

魯本

+0

漂亮。我不知道那是存在的。 –

0

不是本身,但你可以在呼叫站點這樣做。與其說

foo.sorted() 

與你所描述的順序的,你可以說

foo.sortBy(_._1) 

與任何投影或更加複雜,你想表達,例如

foo.sortBy(_._1.toLowercase)