오늘도 코틀린에 대해 계속 공부하면서 스프링에 대한 기본 강의 일부를 잠깐 보게 되었다.
오늘은 배열과 컬렉션에서 최대값과 최소값을 구하는 여러가지 방식에 대해 알아보고 정리해보았다.
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. 오늘 배운 것
- 코틀린 배열과 컬렉션에서 최대값, 최소값 구하는 법에 대해 알아보고 정리해보았다.
- 스프링에 대해 잠깐 공부해보았는데 빨리 더 자세히 공부해보아야겠다.
'오늘 배운 것' 카테고리의 다른 글
24-05-06 Kotlin 구조 분해 선언 (2) (0) | 2024.05.06 |
---|---|
24-05-05 Kotlin 구조 분해 선언 (0) | 2024.05.05 |
24-05-03 Kotlin 컬렉션 다루기 (0) | 2024.05.03 |
24-05-02 Kotlin split(), 스코프 함수 also (0) | 2024.05.02 |
24-05-01 Kotlin 객체(인스턴스)가 생성, 저장, 호출되는 방식 (0) | 2024.05.01 |