从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)]

我可以使用像temp和temp这样的临时变量进行迭代。 但我正在寻找一个像mapfilterList上的转换方法来得到我的解决方案。

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

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

一个方便的功能将split应用于List a:

 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)] 

完整的可运行示例:( 链接)