Obtener un par de numbers de la list de numbers en Kotlin

Tengo la siguiente list:

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

Lo que quiero es la list a continuación:

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

Podría hacer esto usando la iteración con variables temp como start y end . Pero estoy buscando un método de transformación en List como map , filter , etc. para get mi solución.

    Primero, definiría una operación que divide los elementos originales en subintervalos continuos de numbers que no incluyen -1 . Esto puede realizarse convenientemente con operaciones sobre Sequence<T> , como takeWhile y dropWhile . La única parte difícil es crear un iterador y usarlo para cada elemento de la secuencia de distribución de ranges:

     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() } } } 

    Una function de conveniencia para aplicar split a List a igual de fácil:

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

    Luego solo tome el primer y último artículo de cada uno de los ranges resultantes:

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

    Ejemplo:

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

    Ejemplo completo ejecutable: (enlace)