【问题标题】:View Bound methods, ordered Trait and implicit convertingView Bound 方法、有序 Trait 和隐式转换
【发布时间】:2012-12-11 17:36:15
【问题描述】:

如果我有一个具有以下签名的方法:

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,但这不起作用。

【问题讨论】:

    标签: scala sorting


    【解决方案1】:

    给定:

    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
    

    然后你会发现你的 max 函数为 Pairs 工作

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

    【讨论】:

      【解决方案2】:

      你为什么不使用maxBy

      scala> val xs = ('c',3) :: ('a',1) :: ('b',2) :: Nil
      
      scala> val x = xs maxBy(_._2)
      
      //x == ('c',3)
      

      【讨论】:

      • 最大的只是一个例子 :) 我想在函数中使用元素的顺序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多