给出以下列表:
val l = List("A", "A", "C", "C", "B", "C")
如何为每个元素添加自动递增后缀,以便最终得到一个不再包含重复项的列表,如下所示(排序无关紧要):
List("A0", "A1", "C0", "C1", "C2", "B0")
答案 0 :(得分:3)
我写完这个问题之后就自己发现了
val l = List("A", "A", "C", "C", "B", "C")
l.groupBy(identity) // Map(A->List(A,A),C->List(C,C,C),B->List(B))
.values.flatMap(_.zipWithIndex) // List((A,0),(A,1),(C,0),(C,1),(C,2),(B,0))
.map{ case (str, i) => s"$str$i"}
如果有更好的解决方案(可能使用foldLeft
),请告诉我
答案 1 :(得分:1)
直接通过单程:
EmbeddableDate
答案 2 :(得分:0)
也许不是最易读的解决方案,但......
foldRight
这里的想法是你创建列表中每个元素的计数。然后,您从原始值列表的后面进行迭代,并在递减计数映射时将计数附加到值。
你需要在这里定义一个帮助器,因为List[String]
将需要新的-1
和计数作为累加器(因此,将返回两者)。你最后会忽略计数(无论如何,他们都会header-includes:
\renewcommand{\caption}{Figure}
)。
我说你的方式可能更清楚。您需要进行基准测试,看看哪个更快,如果这是一个问题。