使用Scala预先添加元素的替代/更好方法

时间:2011-07-13 20:23:42

标签: scala functional-programming

我有一系列行,就像在这个代码段中一样:

  def insertBeforeLine(text:String,whichLine:String,what:String) = {
    val lines = text.lines
    lines.foldLeft(ListBuffer[String]())((acumulator,element) => {
       acumulator ++ { if(element == whichLine) Array(what,element) else Array(element) }
    }).mkString("\n")
  }

我试图在等于whichLine的每一行之前添加一些东西。有更好/更清洁的方式吗?例如,如果我的输入是:

line1
line2
line4

我将我的函数称为insertBeforeLine(input,"line4","line3"),它将产生:

line1
line2
line3
line4

1 个答案:

答案 0 :(得分:5)

如果你真的有一串行(并且你可以包含行尾字符,并且它是一致的),你可以使用java.lang.String中的替换:

text.replace(which,what+which)

但如果你想要更通用的东西,比如

lines.flatMap(l => if (l==which) Seq(what,l) else Seq(l))

是一种紧凑而清晰的表达方式(至少对那些了解flatMap如何工作的人来说。)

如果你想要一些最有效的东西,那么这是一个很长的丑陋的答案,有很多while循环,可能还有一些字节数组中间体。