嗨,我是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)`
答案 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)