코틀린 언어 정리 4-7

Collection operations

Common operations( 일반적인 연산들 )

Retrieving Collection Parts

컬렉션의 일부를 검색 또는 단순 그룹화하여 새로운 컬렉션을 생성 하는 방법들을 제공합니다. 검색에는 slice, take, drop등이 있고 그룹화에는 chunked, windowed 등의 연산이 있습니다.

 

Slice

입력된 영역(range) 또는 정수를 인덱스로 컬렉션의 요소를 참조하여 새로운 콜렉션을 생성합니다.

 

예제

fun test() {
   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)))
}

 

Take and drop

기본적으로는 컬렉션의 처음 요소, 또는 마지막 요소부터, 입력된 숫자(개수)만큼, 새로운 컬렉션으로 가져오거나(take, takeLast), 버린 후 나머지를 가져옵니다.(drop, dropLast). 단순히 개수만 입력받지 않고 조건을 람다함수로 입력하여 가져올 수도 있습니다.(takeWhile, takeLastWhile, dropWhile, dropLastWhile) 주의할 점은 입력된 조건을 만족하는 데이터를 모두 가져오는 검색이 아니라 조건을 만족하는 동안 다음 요소로 이동하는 continue 조건이라는 점 입니다.

 

연산들

take, takeLast, drop, dropLast, takeWhile, takeLastWhile, dropWhile, dropLastWhile

 

예제

fun test () {
   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))
}

 

예제

//fun main ( args: Array<String> ) {
fun test () {
   var list = listOf("개", "고양이", "돼지", "소", "호랑이", "개", "고양이", "곰", "개")
   var list_takeWhile = list.takeWhile { it != "호랑이" }
   var list_dropWhile = list.dropWhile { it != "호랑이" }
   println(list_takeWhile)
   println(list_dropWhile)
   println(list == (list_takeWhile + list_dropWhile))
}

 

Chunked

chunked는 컬렉션의 요소들을 입력된 개수 만큼 그룹화한 컬렉션을 생성합니다. 각각의 그룹화에 포함되는 요소는 서로 중복되지 않습니다.

 

함수 형식

fun <T> Iterable<T>.chunked(size: Int): List<List<T>>

fun <T, R> Iterable<T>.chunked(size: Int, transform: (List<T>)->R): List<R>

 

size: 그룹화할 개수

transform: 그룹화한 리스트를 변환할 수 있는 함수

 

예제

fun test () {
   val numbers = (0..13).toList()
   println(numbers)
   println(numbers.chunked(3))
   println(numbers.windowed(3))
   println(numbers.windowed(3)==numbers.chunked(3))
}

chunked의 결과: [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]]

windowed의 결과: [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10], [9, 10, 11], [10, 11, 12], [11, 12, 13]]

windowed는 chunked의 개념을 포함할 정도로 일반적이지만 기본적으로 사용하면 이와 같은 차이가 있습니다.

 

Windowed

컬렉션의 모든 요소들에 대해, 현재 요소를 포함하여 입력된 숫자만큼 다음 요소들을 그룹화 한 컬렉션을 생성합니다. chunked와의 차이점은 그룹화 할 요소들이 서로 중복되거나, 중복되지 않게 또는 건너뛰게 설정하는 것이 가능하다는 점입니다. chunked보다 일반화된 기능을 제공합니다.

함수 형식

fun <T> Iterable<T>.windowed(size: Int, step: Int = 1, partialWindows: Boolean = false): List<List<T>>

fun <T, R> Iterable<T>.windowed(size: Int, step: Int = 1, partialWindows: Boolean = false, transform: (List<T>) -> R): List<R>

 

size: 그룹화할 요소 개수

step: 그룹화를 시작할 다음 요소까지의 index 차이

partialWindows: 전체 요소의 개수가 그룹화할 개수와 일치하지 않는 경우 마지막 부분에서는 그룹화 할 개수보다 적은 수의 요소들이 남을 수 있는데, 이 나머지 요소들을 그룹화 시킬 것인지 버릴 것인지를 결정할 수 있습니다.(false: 버림, true: 그룹화)

transform: 그룹화된 각각의 리스트에 변환 연산을 적용할 수 있습니다.

 

유사함수

fun <T> Iterable<T>.zipWithNext(): List<Pair<T, T>>

inline fun <T, R> Iterable<T>.zipWithNext(transform: (s1: T, s2: T) -> R): List<R>

 

기본동작으로는 현재 요소와 다음 요소로 Pair 객체를 생성한 후 새로운 컬렉션의 요소로 추가합니다. 마지막 요소 전까지 연산을 적용하고 마지막 요소에 대해서는 그 다음 요소가 없으므로 연산을 적용하지 않습니다. zipWithNext연산에서 transform도 지원하므로 기본적으로 생성되는 Pair에 대해 변환 연산을 적용할 수 있으므로 Pair가 아닌 전혀 다른 형식으로 저장할 수도 있습니다.

 

예제

//fun main ( args: Array<String> ) {
fun test () {
   var list = listOf("개", "고양이", "돼지", "소", "호랑이", "개", "고양이", "곰", "개")
   var list_takeWhile = list.takeWhile { it != "호랑이" }
   var list_dropWhile = list.dropWhile { it != "호랑이" }
   println(list_takeWhile)
   println(list_dropWhile)
   println(list == (list_takeWhile + list_dropWhile))

   var list_chunked = list.chunked(3)
   println(list_chunked)

   var list_chunked_transformed = list.chunked(3) { it.reduce { accu, element -> accu + "와 " + element } }
   println(list_chunked_transformed)


   var list_windowed = list.windowed(3)
   println(list_windowed)

   var list_windowed_step3 = list.windowed(3, 3)
   println(list_windowed_step3)
   println(list_chunked == list_windowed_step3)

   var list_windowed_step_partialWindow_false = list.windowed(size = 4, step = 3, partialWindows = false)
   println(list_windowed_step_partialWindow_false)

   var list_windowed_step_partialWindow_true = list.windowed(4, 3, true)
   println(list_windowed_step_partialWindow_true)

   var count = 0
   var list_windowed_transformed = list.windowed(4) { it.fold("동물 친구들${ count++ }:") { accu, element -> accu + " " + element } }
   println(list_windowed_transformed)

   var list_zipWithNext = list.zipWithNext()
   println(list_zipWithNext)

   var list_zipWithNext_transform = list.zipWithNext { s1, s2 -> s1 + ":" + s1.length + " " + s2 + ":" + s2.length }
   println(list_zipWithNext_transform)
}

 

+ Recent posts