分块(chunked) vs 滑动窗口(windowed)
在 Kotlin 中,chunked()
(分块)和 windowed()
(滑动窗口)都是用于将集合拆分成子集合的方法,但它们的工作方式和应用场景不同:
✅ chunked()
(分块)
-
含义:将集合划分为一个个不重叠的子块(chunk),每个子块长度相等(最后一个块可能不足)。
-
特点:无重叠,一步跳跃一个块。
-
函数签名:
fun <T> Iterable<T>.chunked(size: Int): List<List<T>>
示例:
val list = listOf(1, 2, 3, 4, 5, 6, 7)
val chunks = list.chunked(3)
println(chunks) // 输出: [[1, 2, 3], [4, 5, 6], [7]]
✅ windowed()
(滑动窗口)
含义:使用一个窗口在集合上滑动,可以重叠,可以设置滑动的步长。特点:可重叠、可定步长、可以控制是否包含不足窗口长度的子集合。函数签名:
fun <T> Iterable<T>.windowed(size: Int,step: Int = 1,partialWindows: Boolean = false
): List<List<T>>
示例 1:默认滑动步长为 1(有重叠)
val list = listOf(1, 2, 3, 4, 5)
val windows = list.windowed(3)
println(windows) // 输出: [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
示例 2:设置步长为 2(可能不重叠)
val windows = list.windowed(3, step = 2)
println(windows) // 输出: [[1, 2, 3], [3, 4, 5]]
示例 3:保留不足窗口大小的部分(partialWindows
)
val windows = list.windowed(3, step = 2, partialWindows = true)
println(windows) // 输出: [[1, 2, 3], [3, 4, 5], [5]]
📌 总结对比:
特性 | chunked() | windowed() |
---|---|---|
子集合是否重叠 | ❌ 不重叠 | ✅ 可重叠 |
步长控制 | ❌ 不可指定步长 | ✅ 可指定步长 step |
不足长度是否保留 | ✅ 自动保留最后一组 | ✅ 需设定 partialWindows = true |
使用场景 | 分组处理(如分页) | 滑动窗口分析(如模式识别、时间序列) |