Image
Kotlin/Collection

[Kotlin Collection] 4. Kotlin groupBy, zip, distinct 를 이용하기 : groupby를 이용해 그룹핑, zip을 이용해 조합, distinct를 이용해 중복제거하기

목차로 돌아가기

 

[Kotlin Collection] Kotlin에서 확장함수를 이용해 Collection 조작하기

목표 Collection 확장함수가 하는 일을 이해한다. 자유롭게 확장 함수를 이용해 데이터를 조작한다. 개요  Kotlin에서는 일반 컬렉션에도 함수형 프로그래밍을 위한 확장 함수를 제공하여, 데이터를

kotlinworld.com

 

목표

  • 그룹핑 함수 groupBy의 개념과 동작을 익힌다.
  • 두개의 Collection을 조합하는 zip의 개념과 동작을 익힌다.
  • 중복제거 함수 distinct의 동작을 익힌다.

확장함수 목록

groupBy

groupBy는 keySelector함수를 통해 key를 select하여 해당 Key로 Map을 만드는(그룹화 하는) 함수이다.

public inline fun <T, K> Iterable<T>.groupBy(keySelector: (T) -> K): Map<K, List<T>> 

 

groupBy의 key는 다양하게 나뉠 수 있는데, 아래 예시를 통해 알아보자. 아래 예시는 짝수와 홀수를 나누는 예시이다.

(0..10).toList().groupBy { it % 2 }
// {0=[0, 2, 4, 6, 8, 10], 1=[1, 3, 5, 7, 9]}

 

 keySelector은 받은 값을 2로 나눈 나머지 값을 key로 선택했고, 따라서 0과 1이 선택되고 해당하는 Map이 생성되었다. 이에 대한 짝수만을 다음과 같이 key값을 이용해 뽑아낼 수 있다.

(0..10).toList().groupBy { it % 2 }[0] // key값 0에 대한 출력
// [0, 2, 4, 6, 8, 10]

 

zip

zip은 두개의 Iterable을 조합하여 각 원소를 순서대로 Pair로 만들어, List<Pair<T,R>>로 만드는 확장함수이다. 

public infix fun <T, R> Iterable<T>.zip(other: Iterable<R>): List<Pair<T, R>> 

만약 두 Iterable의 길이가 다를 경우, 작은 Iterable의 길이를 따른다.

val listString = listOf("a", "b", "c")
val listNumber = listOf(1, 2, 3, 4)

print(listString.zip(listNumber)) // [(a, 1), (b, 2), (c, 3)]

 

 

distinct

 

  • distinct

distinct는 Iterable에서 중복을 제외한 값을 반환하는 확장함수이다.

public fun <T> Iterable<T>.distinct(): List<T>

아래 예제에서는 뒤에 나온 1, 2, 3 이 중복으로 제거되어 1, 2, 3, 4, 5, 6이 출력이 되었다.

val listNumber = listOf(1, 2, 3, 4, 5, 1, 2, 3, 6)

listNumber.distinct() // [1, 2, 3, 4, 5, 6]

 

  • distinctBy

distinctBy는 Iterable에서 특정 조건(selector)을 수행했을 때 중복되는 값을 제외하고 반환하는 확장함수이다.

public inline fun <T, K> Iterable<T>.distinctBy(selector: (T) -> K): List<T> 

 

아래 예시를 보면 1에 대한 %3 은 1이고, 2에 대한 %3은 2, 3에 대한 %3은 0이다. 하지만 4에대한 %3은 1에대한 %3과 중복되어 제거되고, 그 이후에 나오는 5, 6 또한 마찬가지이다. 따라서 1, 2, 3만이 출력값이 된다.

val listNumber = listOf(1, 2, 3, 4, 5, 6)

listNumber.distinctBy { it % 3 } // [1, 2, 3]
반응형

 

이 글의 저작권은 '조세영의 Kotlin World' 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com