有一段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”)
答案 0 :(得分:4)
您的地图的类型为Map[String, Any]
,因此编译器找不到Ordering
对象的Any
。将显式转换添加到Int
:
val max = l.maxBy(_("age").asInstanceOf[Int])
或者尝试使用具有特定值类型的Map
,例如Map[String, Int]
或类似。
其他方式是使用case classes
或tuples
:
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)