kotlin: windowed函数,滑动窗口
一,功能
windowed()
函数从集合中获取所有可能的固定大小子区间(窗口),相比 chunked()
,这个函数更灵活。
参数说明:
-
size
:窗口大小,即每个子列表的元素个数。 -
step
:滑动步长,表示每个窗口之间第一个元素的间隔,默认为1。 -
partialWindows
:是否保留末尾不足窗口大小的子集,默认为 false。
你也可以传入 lambda 表达式对每个窗口进行处理。
二,例子
代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// 窗口大小为3,步长为1(默认)
println(list.windowed(3))
// 输出:[[1, 2, 3], [2, 3, 4], ..., [8, 9, 10]]
// 窗口大小为3,步长为3
println(list.windowed(3, 3))
// 输出:[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
// 步长为4,partialWindows = false
println(list.windowed(3, 4, false))
// 输出:[[1, 2, 3], [5, 6, 7]]
// 步长为4,partialWindows = true
println(list.windowed(3, 4, true))
// 输出:[[1, 2, 3], [5, 6, 7], [9, 10]]
// 窗口求和
println(list.windowed(3, 4, true) { it.sum() })
// 输出:[6, 18, 19]
}
运行结果:
三,例子
代码:
//处理按钮点击事件
binding.button2.setOnClickListener {
//定义一个字符串数组
val test = listOf("AA", "AB", "CC", "DD", "EE", "GF", "GG","HH")
// 将元素按照指定宽带,列出所有的组成方法
println(test.windowed(3))
//[[AA, AB, CC], [AB, CC, DD], [CC, DD, EE], [DD, EE, GF], [EE, GF, GG], [GF, GG, HH]]
// 将元素按照指定宽带,列出所有的组成方法,step = 2
println(test.windowed(3,step = 2))
//[[AA, AB, CC], [CC, DD, EE], [EE, GF, GG]]
// 将元素按照指定宽带,列出所有的组成方法,partialWindows = true
println(test.windowed(3,step = 2,partialWindows = true))
//[[AA, AB, CC], [CC, DD, EE], [EE, GF, GG], [GG, HH]]
}
运行结果: