结合MAP的键和值

时间:2018-09-24 02:32:03

标签: scala functional-programming

我正在尝试解决一个问题,结果以Map [String,(Double,Double)]格式显示。

我想知道是否有一种方法可以将其转换为Map [String,Double,Double],因为我想按字符串对其进行排序?

更具体地说,我想按以下顺序对其进行排序:

("A1", (7.8,9.2))
("A2", (4.2,44.3))
("A11", (9,54.1))

如果我要使用SortedMap,我会得到类似的东西:

("A1", (7.8,9.2))
("A11", (9,54.1))
("A2", (4.2,44.3))

这不是期望的结果。

P.S:我想以适当的格式转换地图,以便我可以申请:

sortBy((x:String)=>(x.substring(1).toInt))

非常感谢

2 个答案:

答案 0 :(得分:0)

据我了解,您想按键对地图进行排序。你可以这样做

val inputMap = Map(
A1->(7.8,9.2),
A11-> (9,54.1),
A2-> (4.2,44.3)
)
val outputMap = inputMap.toSeq.sortBy(_._1.split("A")(1).toInt).toList
println(outputMap) //List((A1,(7.8,9.2)), (A2,(4.2,44.3)), (A11,(9,54.1)))

,前提是密钥始终具有与A + number ex相同的格式。 “ A5”有效,AA1无效。

如果要将答案作为元组(键,值)列表,则可以执行outputMap.toSeq或toList。

答案 1 :(得分:0)

 val ex = Map(("A1", (7.8,9.2))
            ,("A2", (4.2,44.3))
            ,("A11", (9.0,54.1)))


Without changing the format of the Map, using

 ex.toList.sortBy(x=>x._1.substring(1).toInt)

如果您希望通过将Map[String,(Double,Double)]更改为Map[String,Double,Double]

 ex.map{case (a,(b,c))=>(a,b,c)}.toList.sortBy(x=>x._1.substring(1).toInt)

在Scala REPL中:

scala> ex.toList.sortBy(x=>x._1.substring(1).toInt)
res97: List[(String, (Double, Double))] = List((A1,(7.8,9.2)), (A2,(4.2,44.3)), (A11,(9.0,54.1)))

scala> ex.map{case (a,(b,c))=>(a,b,c)}.toList.sortBy(x=>x._1.substring(1).toInt)
res96: List[(String, Double, Double)] = List((A1,7.8,9.2), (A2,4.2,44.3), (A11,9.0,54.1))