我有Array[scala.collection.immutable.Map[String,Any]]
我需要按第二个值"v2"
对它们进行排序并返回相同的地图数组
val col = Array(Map("key" -> Array("aa","bb"), "v1" -> 1 , "v2" -> 3),Map("key" -> Array("cc","bb"), "v1" -> 2 , "v2" -> 4))
我做了以下事情:
scala> col sortBy {col("v2")}
<console>:28: error: type mismatch;
found : String("v2")
required: Int
col sortBy {col("v2")}
或者
scala> col sortWith {col("v2") > col("v2")}
<console>:28: error: type mismatch;
found : String("v2")
required: Int
col sortWith {col("v2") < col("v2")}
并且我不明白它是什么意思required: Int
以及如何对此Array[Map[String,Any]
进行排序!!
修改:
我也试过了
scala> col.toSeq.sortWith(col("v2").trim().toDouble > col("v2").trim().toDouble)
<console>:32: error: type mismatch;
found : String("v2")
required: Int
答案 0 :(得分:1)
您的馆藏是Map[String, Any]
,而不是Map[String, Int]
,因此编制者不知道它所获得的项目是可比的Int
。最简单的方法可能是使用asInstanceOf[Int]
将其转换为可以排序的内容。
col sortBy {_("v2").asInstanceOf[Int]}
然而,无关的价值表明存在后勤问题;使用自定义类而不是普通Map
可能更适合这种情况,并且不需要投射任何东西。
答案 1 :(得分:1)
以下代码将通过将v2值显式转换为Int(假设v2将始终为Int)来工作:
col.sortWith(_.getOrElse("v2",0).asInstanceOf[Int] > _.getOrElse("v2",0).asInstanceOf[Int])
答案 2 :(得分:0)
coupons: Seq[mutable.Map[String, String]]
coupons.sortBy(X => X.get("timestamp")).toSeq
将通过与map对应的值为您获得排序的seq。
例如:输入:Array(Map(timestamp-> 1522233333, coupon_status -> O),Map(timestamp-> 1522211111, coupon_status -> C))
输出:Array(Map(timestamp-> 1522211111, coupon_status -> C),Map(timestamp-> 1522233333, coupon_status -> O))