24-05-04 Kotlin 컬렉션 최대값과 최솟값
오늘도 코틀린에 대해 계속 공부하면서 스프링에 대한 기본 강의 일부를 잠깐 보게 되었다.
오늘은 배열과 컬렉션에서 최대값과 최소값을 구하는 여러가지 방식에 대해 알아보고 정리해보았다.
1. Kotlin 컬렉션 최대값과 최솟값
1-1. max(), maxOrNull()
max() 함수를 사용하면 컬렉션 내 요소들이 비교가능한 것들이라면 최대값을 반환받을 수 있다. 다만 빈 컬렉션의 경우는 예외가 발생한다. 이럴 때 예외를 발생시키지 않고 null 값을 반환받고 싶다면 maxOrNull()을 이용할 수 있다. 그렇지만 반환 타입이 null을 허용하는 타입이 된다는 점에 유의해야한다.
코드로 확인해보면 이해가 쉽다.
fun main() {
val arr = listOf(1,2,3,4,5,6,7,8,9)
val arr2 = charArrayOf('a','b','c','d','e')
val emptyArray = intArrayOf()
println(arr.max()) // 9
println(arr2.max()) // e
// NoSuchElementException 예외 발생
// println(emptyArray.max())
println(emptyArray.maxOrNull()) // null
}
1-2. maxBy(), maxByOrNull(), maxOf(), maxOfOrNull()
비교가 불가능한 요소들 사이에서 특정 기준을 가지고 최대값을 구하고 싶다면 maxBy()와 maxOf()을 사용할 수 있다. 이 둘은 람다식(선택자)을 인자로 받아 그 람다식의 값이 가장 큰 경우의 값을 반환한다. maxBy의 경우는 컬렉션 요소 그 자체를 반환하지만 maxOf()은 람다식의 값을 반환한다는 차이가 있다.
maxByOrNull()과 maxOfOrNull()의 경우 maxOrNull()처럼 반환 타입이 null을 허용하는 타입이 되며 비어있는 컬렉션과 배열에 사용했을 경우 예외가 발생하지 않고 null이 반환된다.
fun main() {
val list = listOf(1 to "하나", 2 to "둘", 3 to "셋", 4 to "넷", 5 to "다섯")
val emptyList:List<Pair<Int,String>> = listOf()
println(list.maxBy { it.first }) // (5, 다섯)
// 사전 오름차순으로 정렬 후 최대값
println(list.maxBy { it.second }) // (1, 하나)
println(list.maxOf { it.first }) // 5
println(list.maxOf { it.second }) // 하나
println(emptyList.maxByOrNull { it.first }) // null
println(emptyList.maxOfOrNull { it.second }) // null
}
1-3. maxWith(), maxWithOrNull(), maxOfWith(), maxOfWithNull()
maxWith()는 비교기를 인자로 받아 그에 따른 최대값을 반환해준다.
maxOfWith()은 선택자와 비교기를 인자로 받아 최대값을 가지는 선택자의 값을 반환해준다. 요소의 값 그 자체가 반환되는 것이 아니라 선택자가 반환된다는 점, 비교기의 경우도 요소의 비교기가 아니라 선택자의 비교기를 받는다는 점에 주의해야한다.
maxWithOrNull()과 maxWithOrNull()의 경우 위에서 본 다른 함수들과 마찬가지로 반환 타입이 null을 허용하는 타입이 되며 비어있는 컬렉션과 배열에 사용했을 경우 예외가 발생하지 않고 null이 반환된다.
fun main() {
val list = listOf(1 to "하나", 2 to "둘둘", 3 to "셋셋셋", 4 to "넷넷넷넷", 5 to "다섯다섯다섯다섯다섯")
val emptyList:List<Pair<Int,String>> = listOf()
// Pair의 첫 번째 요소를 4로 나눈 나머지로 비교해 최대값을 반환한다.
println(list.maxWith ( compareBy {it.first % 4} )) // (3, 셋셋셋)
// Pair의 두 번째 요소인 문자열을 사전순으로 오름차순 정렬하여 가장 마지막 값을 반환한다.
println(list.maxWith {a, b -> a.second.compareTo(b.second) } ) // (1, 하나)
// Pair의 두 번째 요소의 길이로 비교하여 최대값을 갖는 Pair의 두 번째 요소를 반환한다.
println(list.maxOfWith({ a, b -> a.length.compareTo(b.length) } ) {it.second}) // 다섯다섯다섯다섯다섯
// 빈 리스트에 사용하면 null을 반환받을 수 있다.
println(emptyList.maxWithOrNull(compareBy {it.first})) // null
println(emptyList.maxOfWithOrNull({ a, b -> a.length.compareTo(b.length) } ) {it.second}) // null
}
여기까지 최대값을 구하는 법에 대해 정리해보았다. 최소값은 여기서 max를 min으로 바꾸기만 하면 되기 때문에 따로 정리하지는 않으려고한다.
2. 오늘 배운 것
- 코틀린 배열과 컬렉션에서 최대값, 최소값 구하는 법에 대해 알아보고 정리해보았다.
- 스프링에 대해 잠깐 공부해보았는데 빨리 더 자세히 공부해보아야겠다.