[Kotlin] Collections 확장 함수

Subeen·2023년 11월 24일
0

Kotlin 문법

목록 보기
5/23

지난번에는 Map, List와 같이 컬렉션의 개념을 정리하였는데 오늘은 컬렉션에서 자주 사용 되는 함수 몇가지를 정리하고자 한다. 제공되는 확장 함수는 무수히 많지만 zip과 컬렉션을 활용할 때 가장 많이 사용 되는 filtermap을 우선적으로 정리한다.

Collections 확장 함수

filter

  • filter() 함수는 조건과 일치하는 컬렉션 요소를 반환한다.
val list = listOf("apple", "lime", "grapes", "yuja", "blueberry")
val res = list.filter { it.length > 4}  // list의 요소 중 문자열 길이가 5 이상인 요소만 반환한다.
println(res)  // [apple, grapes, blueberry]
val list = listOf("frodo", "frodo", "neo", "neo", "muzi").groupingBy { it }.eachCount()
println(list)  // {frodo=2, neo=2, muzi=1}  // 요소가 같은 것끼리 그룹화 하여 key와 key의 개수를 반환한다.  
    
val res = list.filter { it.value >= 2 }
println(res)  // {frodo=2, neo=2}  // key의 값이 2 이상인 요소만 반환한다.
val list1 = listOf(1, 2, 3, 4, 5, 6, 7, 8)
val list2 = listOf(2, 4, 6, 8, 10)
val res = list1.filter { it in list2 }  // list1의 요소 중 list2에 포함 된 요소만 반환한다.
println(res)  // [2, 4, 6, 8]

map

  • map() 함수는 특정 컬렉션으로부터 새로운 컬렉션을 만들어낸다.
  • 인자로 람다를 전달하면 기존 컬렉션으로부터 새로운 컬렉션이 만들어지며 기존 컬렉션은 변하지 않는다.
// 인자로 전달한 람다식에 의해 요소가 대문자로 변환 된 새로운 컬렉션이 생성된다.
val list = listOf("a", "b", "c")
val res = list.map { it.toUpperCase() }
println(res)  // [A, B, C]
// String 타입인 숫자를 정수형으로 변환 된 새로운 컬렉션이 생성된다.
val list = listOf("1", "2", "3", "4", "5")
val res = list.map { it.toInt() }
println(res)  // [1, 2, 3, 4, 5]
// 문자열이 해당 문자열의 길이로 변환 된 새로운 컬렉션이 생성된다. 
val list = listOf("apple", "banana", "grapes", "peach")
val res = list.map { it.length }
println(res)  // [5, 6, 6, 5]

zip

  • zip() 함수는 두 개의 컬렉션을 합쳐서 pair(두 원소로 이루어진 순서쌍)를 가진 새로운 컬렉션을 반환한다.
  • 두 컬렉션의 크기가 다를 경우 더 작은 컬렉션의 크기 만큼의 새로운 컬렉션이 생성된다.
val a = listOf(1, 2, 3, 4)
val b = listOf(-3, -1, 0, 2)
val res = a.zip(b)
println("$res")  // [(1, -3), (2, -1), (3, 0), (4, 2)]

for ((num1, num2) in res) {
	println("$num1, $num2")
}

/* for문 결과
1, -3
2, -1
3, 0
4, 2
*/

두 컬렉션의 크기가 다를 경우 다음과 같이 b 리스트의 크기로 새로운 컬렉션이 생성 되었다.

val a = listOf(1, 2, 3, 4)
val b = listOf("a", "b", "c")
val res = a.zip(b)
println("$res")  // [(1, a), (2, b), (3, c)]

다음과 같이 zip 함수의 인자로 람다를 전달하여 두 컬렉션의 값을 사용할 수도 있다.

val a = listOf(1, 2, 3, 4)
val b = listOf(-3, -1, 0, 2)
val res = a.zip(b)
println("$res")  // [(1, -3), (2, -1), (3, 0), (4, 2)]

// 두 컬렉션의 값을 곱한 새로운 컬렉션이 생성 된다. 
val cal1 = a.zip(b) {a, b -> a * b}
println("$cal1")  // [-3, -2, 0, 8]

val cal2 = a.zip(b) {a, b -> a * b}.sum()
println("$cal2")  // 3

프로그래머스의 두 1차원 정수 배열(a, b)의 내적을 구하는 문제를 푸는데 처음에는 다음과 같이 반복문을 사용하여 문제를 해결 하였다.

var arr = IntArray(a.size)
for (i in 0 until arr.size) {
	arr[i] = a[i] * b[i]
}        
return arr.sum()

zip 함수를 알고 나서 해당 코드를 수정하였는데 코드 1줄로 문제를 해결 할 수 있었다.. 👏🏻

return a.zip(b) {a, b -> a * b}.sum()

참조
Transformation Operation

profile
개발 공부 기록 🌱

0개의 댓글