지난번에는 Map, List와 같이 컬렉션의 개념을 정리하였는데 오늘은 컬렉션에서 자주 사용 되는 함수 몇가지를 정리하고자 한다. 제공되는 확장 함수는 무수히 많지만 zip
과 컬렉션을 활용할 때 가장 많이 사용 되는 filter
와 map
을 우선적으로 정리한다.
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]
// 인자로 전달한 람다식에 의해 요소가 대문자로 변환 된 새로운 컬렉션이 생성된다.
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]
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()