假设我们得到一个整数列表R = [3,5,3,6,0,6,7]
,阈值x
(整数)和窗口大小(整数)p
。例如,x = 4且p = 2。
我需要找到验证以下条件的第一个索引t
:
R[t] >= 4, R[t+1] >= 4
。由于p = 2,我们只需要验证两个框t
和t+1
。如果p
等于3
,我们将需要验证t
,t+1
和t+2
。我要搜索的t
是5
(索引从0开始)。
如何在Kotlin中以优雅的方式(而不是在元素上循环)编写此代码。
给出错误(x = 4和p = 2的一个试探性。由于我们开始将索引从0开始,输出应该为3):
val numbers = listOf(1, 2, 3, 4, 6, 8, 2)
val firstIndex = numbers.find { it >= 4 for it in it..it+2-1}
答案 0 :(得分:2)
使用windowed
检查列表中每个索引的值组。使用withIndex()
,以便遍历最终结果中所需的索引。然后使用firstOrNull()
(其中find()
是它的冗余别名)。最后,使用?.index
获取满足条件的第一个条目的索引;如果不满足,则返回null。
val x = 4
val p = 3
val list = listOf(2,5,3,6,0,6,7)
val t = list
.windowed(p)
.withIndex()
.firstOrNull { (_, sublist) -> sublist.all { it >= x } }
?.index
答案 1 :(得分:2)
val numbers = listOf(1, 2, 3, 4, 6, 8, 2)
val p = 2
val x = 4
val t = numbers.windowed(p).indexOfFirst { window -> window.all { it >= x } } // t == 3
t
等于-1
,如果找不到匹配项
答案 2 :(得分:1)
find返回与给定谓词匹配的第一个元素;如果找不到此类元素,则返回null。
答案 3 :(得分:1)
如果我正确理解,则应该可以:
fun main() {
val list = listOf(3,5,3,6,0,6,7)
val p = 2
val x = 4
val t = list.withIndex().windowed(p).firstOrNull() { window ->
window.all { it.value >= x }
}?.first()?.index
println(t)
}
输出:
5