조용한 담장

코틀린(Kotlin) Collections : Retrieving Collection Parts 본문

kotlin

코틀린(Kotlin) Collections : Retrieving Collection Parts

iosroid 2020. 4. 6. 14:09

kotlin

코틀린의 collection 의 Retrieving Collection Parts 에 대해 살펴보자.

원문 https://kotlinlang.org/docs/reference/collection-parts.html 을 보며 정리.

Slice

slice() 를 사용하여 지정된 위치의 element 로 새로운 list 를 구성한다.

range 나 위치를 표현하는 상수 값을 가진 collection 을 전달하여 위치값을 전달 할 수 있다.

val numbers = listOf("one", "two", "three", "four", "five", "six")    
println(numbers.slice(1..3))
println(numbers.slice(0..4 step 2))
println(numbers.slice(setOf(3, 5, 0)))

// output:
// [two, three, four]
// [one, three, five]
// [four, six, one]

Take and drop

take() 를 사용하여 첫번째 element 부터 특정 개수만큼을 가져온다.

takeLast() 를 사용하면 마지막 element 부터 가져온다.

collection 의 크기보다 더 큰 개수를 요청하면 전체 collection 을 리턴한다.

drop() 을 사용하여 첫번째 element 부터 특정 개수를 제외하고 가져온다.

dropLast() 를 사용하면 마지막 element 부터 특정 개수를 제외하고 가져온다.

val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.take(3))
println(numbers.takeLast(3))
println(numbers.drop(1))
println(numbers.dropLast(5))

// output:
// [one, two, three]
// [four, five, six]
// [two, three, four, five, six]
// [one]

아래의 함수들을 사용하면 predicate 를 통해 take or drop 을 할 수 있다.

takeWhile() 는 predicate 와 매칭되는 않는 첫번째 결과와 그 이후의 element 들을 제외하고 가져온다. 첫번째 element 가 매칭되지 않으면 empty collection 이 리턴된다.

val chars = ('a'..'z').toList()
println(chars.takeWhile { it < 'f' })
println(chars.takeLastWhile { it > 'w' })
// output:
// [a, b, c, d, e]
// [x, y, z]
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.takeWhile { !it.startsWith('f') })
println(numbers.takeWhile { !it.startsWith('o') })
// output:
// [one, two, three]
// []

takeLastWhile() 는 마지막 element 부터 predicate 와 매칭된 결과를 가져오며 마지막 element 가 매칭되지 않으면 empty collection 이 리턴된다.

dropWhile() 는 predicate 와 매칭된 첫번째 element 부터 마지막 element 까지들을 제외하고 가져온다.

dropLastWhile() 는 마지막 element 부터 predicate 와 매칭된 결과를 제외하고 가져온다.

val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.takeLastWhile { it != "three" })
println(numbers.dropWhile { it.length == 3 })
println(numbers.dropLastWhile { it.contains('i') })

// output:
// [four, five, six]
// [three, four, five, six]
// [one, two, three, four]

Chunked

chunked() 를 사용하여 collection 을 주어진 크기로 나눌 수 있다.

val numbers = (0..13).toList()
println(numbers.chunked(3))

// output:
// [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]]

람다 함수를 인자로 사용하여 transformation 을 적용할 수 있다.

val numbers = (0..13).toList() 
println(numbers.chunked(3) { it.sum() })  // `it` is a chunk of the original collection

// output:
// [3, 12, 21, 30, 25]

Windowed

windowed() 를 collection 의 element 를 주어진 사이즈로 구성 가능한 모든 리스트를 얻는다.

sliding window 방식으로 결과를 구성한다.

val numbers = listOf("one", "two", "three", "four", "five")    
println(numbers.windowed(3))

// output:
// [[one, two, three], [two, three, four], [three, four, five]]

step 은 윈도우의 첫번째 element 간의 거리를 지정한다. 기본은 1 이다.

partialWindows 는 윈도우 크기보다 작아 남게 되는 element 들을 결과에 포함한다.

val numbers = (1..10).toList()
println(numbers.windowed(3, step = 2))
println(numbers.windowed(3, step = 2, partialWindows = true))
println(numbers.windowed(3, step = 2) { it.sum() })

// output:
// [[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]]
// [[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9], [9, 10]]
// [6, 12, 18, 24]

zipWithNext() 를 사용하면 인접한 두개의 element 를 Pair 로 가지는 List 를 생성한다.

Pair 두개의 element 를 사용하는 transformation function 을 사용할 수 있다.

val numbers = listOf("one", "two", "three", "four", "five")    
println(numbers.zipWithNext())
println(numbers.zipWithNext() { s1, s2 -> s1.length > s2.length})

// output:
// [(one, two), (two, three), (three, four), (four, five)]
// [false, false, true, false]


Comments