Функция windowed

Функция windowed создает последовательность "окон" - подсписков заданного размера, которые перемещаются по коллекции с указанным шагом. Принимает параметры: size - размер окна, step - шаг перемещения, partialWindows - включать ли неполные окна в конце. Работает с коллекциями: List, Array, String.

Синтаксис

kotlinfun <T> Iterable<T>.windowed(
  size: Int,
  step: Int = 1,
  partialWindows: Boolean = false
): List<List<T>>
kotlinfun <T> Array<T>.windowed(
  size: Int,
  step: Int = 1,
  partialWindows: Boolean = false
): List<List<T>>
kotlinfun String.windowed(
  size: Int,
  step: Int = 1,
  partialWindows: Boolean = false
): List<String>

Пример

Создадим окна размера 3 с шагом 1 из списка чисел:

kotlinval numbers = listOf(1, 2, 3, 4, 5)
val res = numbers.windowed(3)
println(res)

Результат выполнения кода:

kotlinList<List<Int>> [[1, 2, 3], [2, 3, 4], [3, 4, 5]]

Пример

Создадим окна размера 3 с шагом 2 из массива символов:

kotlinval chars = arrayOf('a', 'b', 'c', 'd', 'e')
val res = chars.windowed(3, 2)
println(res)

Результат выполнения кода:

kotlinList<List<Char>> [['a', 'b', 'c'], ['c', 'd', 'e']]

Пример

Создадим окна размера 3 с шагом 1, включая неполные окна:

kotlinval numbers = listOf(1, 2, 3, 4)
val res = numbers.windowed(3, 1, true)
println(res)

Результат выполнения кода:

kotlinList<List<Int>> [[1, 2, 3], [2, 3, 4], [3, 4], [4]]

Пример

Использование windowed со строкой:

kotlinval text = "abcde"
val res = text.windowed(3)
println(res)

Результат выполнения кода:

kotlinList<String> ["abc", "bcd", "cde"]

Пример

Обработка каждого окна с преобразованием:

kotlinval numbers = listOf(1, 2, 3, 4, 5)
val res = numbers.windowed(3).map { it.sum() }
println(res)

Результат выполнения кода:

kotlinList<Int> [6, 9, 12]

Смотрите также

  • функцию chunked,
    которая разбивает коллекцию на chunks фиксированного размера
  • функцию slidingWindow,
    которая является синонимом windowed
  • функцию partition,
    которая разделяет коллекцию на две части по условию