在列表中找到验证条件的第一个元素

时间:2020-10-09 15:15:58

标签: kotlin

假设我们得到一个整数列表R = [3,5,3,6,0,6,7],阈值x(整数)和窗口大小(整数)p。例如,x = 4且p = 2。

我需要找到验证以下条件的第一个索引t

  • R[t] >= 4, R[t+1] >= 4。由于p = 2,我们只需要验证两个框tt+1。如果p等于3,我们将需要验证tt+1t+2

我要搜索的t5(索引从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}

4 个答案:

答案 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