zip, chunked and windowed

Combining and Splitting

Example

fun main() {
    val names = listOf("Asha", "Ravi", "Kiran")
    val scores = listOf(88, 92, 75)
    println(names.zip(scores))
    println(names.zip(scores) { n, s -> "$n=$s" })
    val (n2, s2) = names.zip(scores).unzip()
    println("$n2 $s2")

    val ids = (1..7).toList()
    println(ids.chunked(3))                          // pages / batches
    println(ids.windowed(3))                         // sliding windows
    println(ids.windowed(3, step = 2, partialWindows = true))
    println(ids.zipWithNext { a, b -> b - a })
}

Output

[(Asha, 88), (Ravi, 92), (Kiran, 75)]
[Asha=88, Ravi=92, Kiran=75]
[Asha, Ravi, Kiran] [88, 92, 75]
[[1, 2, 3], [4, 5, 6], [7]]
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]
[[1, 2, 3], [3, 4, 5], [5, 6, 7], [7]]
[1, 1, 1, 1, 1, 1]

Moving Average with windowed

Example

Stock and fitness apps show a moving average to smooth out noise.

fun main() {
    val dailySteps = listOf(4000, 8000, 6000, 10000, 2000, 9000, 7000)
    val avg3 = dailySteps.windowed(3) { it.average().toInt() }
    println("3-day average: $avg3")
    val growth = dailySteps.zipWithNext { a, b -> if (b > a) "up" else "down" }
    println(growth)
}

Output

3-day average: [6000, 8000, 6000, 7000, 6000]
[up, down, up, down, up, down]

Exercise

Exercise: Given val words = listOf("kotlin", "java", "kotlin", "swift", "java", "kotlin"), print each word with its count, most frequent first.

Show answer
fun main() {
    val words = listOf("kotlin", "java", "kotlin", "swift", "java", "kotlin")
    words.groupingBy { it }.eachCount()
        .entries.sortedByDescending { it.value }
        .forEach { (w, c) -> println("$w: $c") }
}