2017-11-03 9 views
1
의 숫자의 목록에서 숫자의 쌍을 가져

나는 다음과 같은 목록을 가지고 :코 틀린

[-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 같은 변형 방법을 찾고 있는데, 내 솔루션을 얻으려면 map, filter 등이 필요합니다.

답변

1

먼저, 원래 요소를 -1을 제외한 숫자의 연속적인 하위 범위로 분할하는 작업을 정의합니다. 이는 Sequence<T> 이상의 작업 (예 : takeWhiledropWhile)으로 편리하게 수행 할 수 있습니다. 이어서

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

:

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을 적용 : 유일한 까다로운 부분은 하나의 반복기를 생성하고 광범위의 resutling 시퀀스의 각 항목에 대해 사용하는

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

예 :

,536,913 단지 결과 범위의 각각 첫 번째와 마지막 항목을
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)