将自动递增后缀附加到List的重复元素

时间:2017-06-07 12:06:27

标签: scala list suffix

给出以下列表:

val l = List("A", "A", "C", "C", "B", "C")

如何为每个元素添加自动递增后缀,以便最终得到一个不再包含重复项的列表,如下所示(排序无关紧要):

List("A0", "A1", "C0", "C1", "C2", "B0")

3 个答案:

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

我说你的方式可能更清楚。您需要进行基准测试,看看哪个更快,如果这是一个问题。

Ideone