list - 从 Kotlin 数字列表中获得一对数字

标签 list numbers kotlin sequence

我有以下 list :
[-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应用于List的便捷功能也很容易:
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)

关于list - 从 Kotlin 数字列表中获得一对数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47100947/

相关文章:

r - 将函数应用于 R 中的数据帧列表

Java 数组打印出奇怪的数字和文本

android - Android ICS 中的 notification.number 在哪里

android - TopAppBar 与 Navigation 集成的脚手架

Kotlin 协程 - 使用协程作用域/上下文的不同选项?

用于列表的 python numpy.where 函数

Java - 跟踪新列表项以便以后删除?

python - 读取带有单引号数据的文件并将其存储在 python 列表中

numbers - PI 是图灵可计算数吗?

kotlin - (不可变集合是可变的)在 Kotlin 中返回 true