Альтернативный / лучший способ добавления элемента с использованием Scala - PullRequest
2 голосов
/ 14 июля 2011

У меня есть коллекция строк, как в этом фрагменте:

  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 Ответ

5 голосов
/ 14 июля 2011

Если у вас действительно есть строка строк (и вы можете включить символ конца строки, и он соответствует), вы можете использовать replace из java.lang.String:

text.replace(which,what+which)

но если вы хотите что-то более общее, что-то вроде

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

- это компактный и понятный способ выразить это (по крайней мере, тем, кто знает, как работает flatMap).

Если вам нужно что-то максимально эффективное, то это длинный уродливый ответ с большим количеством циклов while и, возможно, некоторыми промежуточными байтовыми массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...