如何通过计算所有中间值在前一个Scala中创建一个新的List?

时间:2016-05-20 18:48:40

标签: scala functional-programming

我在Scala中有String的列表。我想创建一个新列表,其中每个元素都是前一个列表中的对应元素,附加了尽可能多的\n s,并且在列表元素之前累积了多个List("a\nb\nc","\nd","e") => List("a\nb\nc","\n\n\nd","\n\n\ne") s。像这样:

\n

没有新的fold附加到第一个,第二个附加到第二个(第一个有2个)和三个(第一个和第二个累计)到第三个。

我发现这个问题存在于yield <form method="get" action="/save" type="multipart/form-data"> File to upload: <input type="file" name="file"><br /> <input type="text" name="name"> <input type="submit" value="Upload" /> </form> 构造之间。 在Scala中不使用任何可变变量的情况下实现此目的的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

嗯,没有人禁止你使用List作为折叠累加器并将你的状态带到那里。我会指望&#34; f&#34; chars,因为它更容易调试:

val lf = List("afbfc", "fd", "e")
def count_char(s: String) = s.count(_ == 'f')
val fold_res = lf.foldLeft((List[String](), 0)) ((acc, next_string) =>
  (("f" * acc._2 + next_string) +: acc._1,
    count_char(next_string) + acc._2))
fold_res._1.reverse

答案 1 :(得分:2)

def doTheThing (a: List[String]): List[String] = 
  ((0,List.empty[String]) /: a) {(acc, x) =>
    (acc._1 + x.count(_ == '\n')) -> (acc._2 ++ List("\n"*acc._1 + x))
  }._2

答案 2 :(得分:2)

与其他人大致相同,两次通过(如此慢)但可能更清晰。

// calculate the cumulative number of \n we've seen so far
val ns = xs.scanLeft(0){(a, s) => a + s.count(e => e == 'f')}
//> ns  : List[Int] = List(0, 2, 3)

// prepend that many "f" to the elements of the original list
val ys = (ns zip xs).map { case (l,r) => "f"*l ++ r }
//> ys  : List[String] = List(afbfc, fffd, fffe)