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))

リストの2番目の要素で順序を定義して、関数でそれを操作できるようにするにはどうすればよいですか?

使ってみました

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

ペアのDoubleをRichDoubleに暗黙的に変換します。これにより、順序付けられた特性が拡張されますが、これは機能しません。

4

2 に答える 2

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] = scala.math.Ordering$$anon$7@3b2e9a90

次に、関数がsmaxで機能していることがわかりますPair

scala> max(List(Pair("foo", 1), Pair("bar", 2), Pair("baz", 2.2)))
res5: Pair = Pair(baz,2.2)
于 2012-12-10T18:07:33.480 に答える
0

使ってみませんmaxByか?

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

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

//x == ('c',3)
于 2012-12-10T18:59:17.013 に答える