从Kotlin的数字列表中获取一对数字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Kotlin的数字列表中获取一对数字相关的知识,希望对你有一定的参考价值。

我有以下列表:

[-1, -1, 2, 3, 4, 5, -1, 9, 10, 11, -1, -1, 23, 24, 25]

我想要的是以下列表:

[Pair(2,5), Pair(9,11), Pair(23,25)]

我可以使用像startend这样的临时变量进行迭代。但我正在寻找List上的转换方法,如mapfilter等,以获得我的解决方案。

答案

首先,我将定义一个操作,将原始元素拆分为连续的数字子范围,不包括-1。这可以通过Sequence<T>上的操作方便地完成,例如takeWhiledropWhile。唯一棘手的部分是创建一个迭代器并将其用于重新排列范围的每个项目:

fun <T> Sequence<T>.split(separator: T): Sequence<List<T>> {
    val originalIterator by lazy { iterator() }
    val eachSequence = Sequence { originalIterator }
        .dropWhile { it == separator }
        .takeWhile { it != separator }
    return generateSequence { eachSequence.toList().takeIf { it.isNotEmpty() } }
}

split应用于Lista的便利功能同样容易:

fun <T> List<T>.split(separator: T) = 
    asSequence().split(separator).toList()

然后,只需获取每个结果范围的第一个和最后一个项目:

fun <T> List<T>.splitToRanges(separator: T) = 
    split(separator).map { it.first() to it.last() }

例:

val ints = listOf(-1, -1, 2, 3, 4, 5, -1, 9, 10, 11, -1, -1, 23, 24, 25)
println(ints.splitToRanges(-1)) // [(2, 5), (9, 11), (23, 25)]

完整的可运行示例:(link)

以上是关于从Kotlin的数字列表中获取一对数字的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 中的自定义数字键盘

获取数组列表中缺少的数字

从viewPager片段(Kotlin)中获取用户输入信息

*** Bool 编码为数字属性列表片段。属性列表编码器

如何从片段 KOTLIN 中调用意图 [重复]

猜数字小游戏