Поскольку вы используете Kotlin, у вас есть преимущество неизменных типов данных и функций без побочных эффектов. Вот как это сделать с неизменяемым списком в функции, которая не раскрывает какое-либо состояние извне, используя fold()
:
val originalList = listOf("1", "2", "3", ".", "4", ".")
val (filteredList, _) = originalList.fold(
Pair(emptyList<String>(), false)
) { (newList, found), item ->
if (item == "." && !found) Pair(newList + item, true)
else if (item == ".") Pair(newList, true)
else Pair(newList + item, found)
}
println(filteredList)
Результат:
[1, 2, 3, ., 4]
fold()
принимает начальное значение аккумулятора, затем применяет функцию для каждого элемента списка, обновляя аккумулятор по мере его выполнения.
Здесь мы устанавливаем аккумулятор на Pair
пустого list, в котором мы создадим новый список и логическое значение, чтобы отслеживать, видели ли мы уже .
.
Для каждого элемента исходного списка мы возвращаем новую пару, добавляя элемент в новый список (при необходимости) и обновление, видели ли мы уже .
. newList + item
не добавляет элемент в неизменяемый список, он возвращает новый неизменяемый список с добавленным к нему элементом. Поскольку мы передаем отслеживание Bool
, если мы видели .
как часть пары на каждой итерации, нет необходимости во временной переменной вне функции для отслеживания этого.
Наконец, поскольку накопленные value - это пара, мы используем деструктурирование , чтобы извлечь только накопленный список (первое значение) пары с val (filteredList, _) = pair
.
Для вашего списка возвращенные значения Pair будут выглядеть так это:
([1], false)
([1, 2], false)
([1, 2, 3], false)
([1, 2, 3, .], true)
([1, 2, 3, ., 4], true)
([1, 2, 3, ., 4], true)