2012-12-10 20 views
3

如果我有一个具有以下签名的方法:查看绑定方法,有序的特质和隐式转换

def max[T <% Ordered[T]](list:List[T]): T={ 
//return max. element of List (for example) 
} 

,我想给这样的对的列表,以它:

val fu:List[Pair[String, Double]] = List(Pair("a", 3.1),Pair("b", 1.7),Pair("c", 3.1),Pair("d", 5.4)) 

如何定义列表的第二个元素的顺序,以便我可以在函数中使用它?

我试图用

implicit def wrapper(p: Pair[String, Double])=new runtime.RichDouble(p._2) 

一对双隐式转换为延伸有序性状的RichDouble,但不工作。

回答

6

给出:

scala> def max[T <% Ordered[T]](xs: List[T]) = xs.max 
max: [T](xs: List[T])(implicit evidence$1: T => Ordered[T])T 

scala> case class Pair(x: String, y: Double) 
defined class Pair 

您需要定义排序对象Pair

scala> implicit val order = scala.math.Ordering.by[Pair, Double](_.y) 
order: scala.math.Ordering[Pair] = [email protected] 

这时你会发现你的max功能工作Pair小号

scala> max(List(Pair("foo", 1), Pair("bar", 2), Pair("baz", 2.2))) 
res5: Pair = Pair(baz,2.2) 
0

为什么不你用maxBy

scala> val xs = ('c',3) :: ('a',1) :: ('b',2) :: Nil 

scala> val x = xs maxBy(_._2) 

//x == ('c',3) 
+0

最大的事情只是一个例子:)我想使用函数中元素的排序。 – user1892364

+0

好吧然后:) –