按Scala中的一个值对Map数组进行排序

时间:2016-08-24 14:24:58

标签: scala scala-collections

我有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

3 个答案:

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