본문 바로가기
코딩테스트 준비(kotlin)/문법정리

[kotlin 코틀린] groupBy와 groupingBy

by 1chanhue1 2024. 6. 21.

groupBy와 groupingBy 함수는 비슷한 기능을 제공하지만 사용 방법과 반환값이 다르다 !! 

groupBy

groupBy 함수는Map<K, List<V>>형태의 결과를 반환한다. 즉, 키와 키에 해당하는 요소들을 리스트로 묶은 맵을 반환한다. 이 함수는 컬렉션의 각 요소에 대해 키를 추출하여 그룹화하고, 각 그룹은 해당 키와 일치하는 요소들의 리스트로 표현된다.

위 예시처럼 문자열의 길이를 기준으로 그룹화할 수 있습니다.

val words = listOf("apple", "apricot", "banana", "blueberry", "cherry")

val groupsByFirstChar = words.groupBy { it.first() }

println(groupsByFirstChar) 
// 출력: {a=[apple, apricot], b=[banana, blueberry], c=[cherry]}

문자열의 첫 글자를 기준으로 그룹화할 수 있습니다.

al words = listOf("apple", "apricot", "banana", "blueberry", "cherry")

val groupsByFirstChar = words.groupBy { it.first() }

println(groupsByFirstChar) 

// 출력: {a=[apple, apricot], b=[banana, blueberry], c=[cherry]}

데이터 클래스와 함께 사용할 수도 있습니다.

data class Person(val name: String, val age: Int)

val people = listOf(
    Person("Alice", 30),
    Person("Bob", 25),
    Person("Charlie", 30),
    Person("David", 25),
    Person("Eve", 35)
)

val groupsByAge = people.groupBy { it.age }

println(groupsByAge) 
// 출력: {30=[Person(name=Alice, age=30), Person(name=Charlie, age=30)], 
// 25=[Person(name=Bob, age=25), Person(name=David, age=25)], 35=[Person(name=Eve, age=35)]}

groupingBy

groupingBy 함수는 Grouping<T, K> 객체를 반환한다. 이 객체는 그룹화된 요소를 나타내는 eachCount  fold와 같은 함수를 제공한다. Grouping 객체는 각 그룹에서 요소를 추출하고 계산하는 데 사용된다.

짝수와 홀수로 그룹화하고 각 그룹의 요소 개수 세기

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

val groups = numbers.groupingBy { if (it % 2 == 0) "even" else "odd" }
//Grouping 타입을 반환하며, 이 타입 자체를 직접 출력하는 방법은 없습니다. 
//Grouping 타입을 반환하며, 이 타입 자체를 직접 출력하는 방법은 없습니다. 
//Grouping 타입을 반환하며, 이 타입 자체를 직접 출력하는 방법은 없습니다. 
val counts = groups.eachCount()

println(counts) // 출력: {odd=3, even=3}

문자열의 첫 글자로 그룹화하고 각 그룹의 요소 개수 세기

val words = listOf("apple", "apricot", "banana", "blueberry", "cherry")

val groups = words.groupingBy { it.first() }
val counts = groups.eachCount()

println(counts) 
// 출력: {a=2, b=2, c=1}

문자열의 첫 글자로 그룹화하고 각 그룹의 단어를 연결하기

val words = listOf("apple", "apricot", "banana", "blueberry", "cherry")

val groups = words.groupingBy { it.first() }
val concatenatedWords = groups.fold("") { acc, word -> acc + word }

println(concatenatedWords)
// 출력: {a=appleapricot, b=bananablueberry, c=cherry}