如何替换地图中的重复键

时间:2019-12-01 17:07:57

标签: scala dictionary

嗨,我是scala编程的新手。 我想知道是否有一种方法可以重命名map的重复键。

假设我在这里有一个斯卡拉地图

(“ a”-> 1,“ b”-> 2,“ c”-> 3,“ d”-> 4,“ a”-> 5,“ c”-> 6,“ e”- > 7,“ a”-> 8)

我想要以下格式的输出。地图应该看起来像

(“ a_1”-> 1,“ b”-> 2,“ c_1”-> 3,“ d”-> 4,“ a_2”-> 5,“ c_2”-> 6,“ e”- > 7,“ a_3”-> 8)

我只想为每个重复的键出现分配一个计数系统。

到目前为止,我已经能够编写代码,避免重复密钥出现。

var seq=map.toSeq
var cnt=seq.groupBy(_._1).mapValues(_.length)`

1 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

val seq = Seq("a"->1,"b"->2,"c"->3,"d"->4,"a"->5,"c"->6,"e"->7,"a"->8)

val cnt = seq.groupBy(_._1).flatMap{case (_, elems) => elems.zipWithIndex.map{case ((k,v), i) => s"${k}_${i+1}" -> v}}
print(cnt)

输出:

Map(c_1 -> 3, d_1 -> 4, a_2 -> 5, b_1 -> 2, a_3 -> 8, c_2 -> 6, a_1 -> 1, e_1 -> 7)

注意:如果“ b_1”的格式应为“ b”,则可以根据elems的大小引入条件

编辑:

这是代码:

val cnt = seq.groupBy(_._1).flatMap{case (_, elems) => if(elems.size>1){ elems.zipWithIndex.map{case ((k,v), i) => s"${k}_${i+1}" -> v}} else elems}
println(cnt)
Map(e -> 7, c_1 -> 3, a_2 -> 5, b -> 2, a_3 -> 8, c_2 -> 6, a_1 -> 1, d -> 4)