Вы можете сбросить ваш Seq
с foldLeft
:
val s = Seq("ptxt"->"how ","list"->"you doing","ptxt"->"whats up","ptxt"-> "this ","list"->"is ","list"->"cool")
val r: Seq[String] = s.foldLeft(List[String]()) {
case (xs, ("ptxt", s)) => s :: xs
case (x :: xs, ("list", s)) => (x + s) :: xs
}.reverse
Если вас не волнует заказ, вы можете опустить reverse
.
Функция foldLeft
принимает два аргумента: первое - это начальное значение, а второй - это функция, принимающая два аргумента: предыдущий результат и элемент последовательности.Результат этого метода затем подается следующим вызовом функции в качестве первого аргумента.
Например, для чисел foldLeft
, будет просто создать сумму всех элементов, начиная слева.
List(5, 4, 8, 6, 2).foldLeft(0) { (result, i) =>
result + i
} // 25
В нашем случае мы начинаем с пустого списка.Затем мы предоставляем функцию, которая обрабатывает два случая, используя сопоставление с образцом.
Случай, когда клавиша "ptxt".В этом случае мы просто добавляем значение к списку.
case (xs, ("ptxt", s)) => s :: xs
Случай, когда ключом является «список».Здесь мы берем первую строку из списка (используя сопоставление с образцом) и затем соединяем значение с ней, после чего мы помещаем ее обратно с остальной частью списка.
case (x :: xs, ("list", s)) => (x + s) :: xs
Atконец, так как мы добавляли элемент, нам нужно вернуть наш список.Почему мы готовились, а не добавлялись?Потому что append в неизменяемом списке - O(n)
, а prepend - O(1)
, поэтому он более эффективен.