列表中的max函数在scala中不起作用?

时间:2015-03-27 11:10:47

标签: scala

有一段scala代码,我觉得很容易

val m1 = Map("age"->60,"name"->"x")
val m2 = Map("age"->99,"name"->"j")
val l = List(m1,m2)
val max = l.maxBy(_("age"))

但是,而不是期待的结果     val m2 =地图(“年龄” - > 99,“名称” - >“j”) 我收到一个错误:

<console>:13: error: No implicit Ordering defined for Any.

我知道隐含参数有问题,但我不知道如何解决这个问题。

更新 此外,假设我需要一个更通用的解决方案,一个函数

def max(l:List[Map[String,Any]],key:String)

然后 max(l,“age”)== Map(“age” - &gt; 99,“name” - &gt;“j”) max(l,“name”)== Map(“age” - &gt; 60,“name” - &gt;“x”)

4 个答案:

答案 0 :(得分:4)

您的地图的类型为Map[String, Any],因此编译器找不到Ordering对象的Any。将显式转​​换添加到Int

val max = l.maxBy(_("age").asInstanceOf[Int])

或者尝试使用具有特定值类型的Map,例如Map[String, Int]或类似。

其他方式是使用case classestuples

val list = List((60, "j"), (99, "x"))
list.maxBy(_._1)

答案 1 :(得分:0)

尝试使用最后一行作为 val max = l.maxBy(_("age").toString.toInt)

答案 2 :(得分:0)

这有效,

l.maxBy(m => m("age").toString.toInt)

并且更接近于最大(数字)年龄的预期语义,即使它不能证明类型安全,原始地图类型也不保留有关预期类型的​​信息,如前所述。

答案 3 :(得分:0)

这样的事可能有效(不是我喜欢Map[String, Any]的想法):

def myOrder(k: String) = { 
  x: Map[String, Any] => 
    x(k) match { case i:Int => (i, "") 
                 case s:String => (0, s) } 
}

l.maxBy(myOrder("age")) // Map(age -> 99, name -> j)
l.maxBy(myOrder("name")) // Map(age -> 60, name -> x)