개발을 하다보면 간혹가다가 배열 혹은 리스트를 정렬할 때,
여러 프로퍼티를 기준으로 정렬을 해야할 때가 있습니다.
아래와 같이 이름, 나이, 키, 몸무게를 프로퍼티로 가지는 Person 클래스가 있습니다.
class Person(val name: String, val age: Int, val height: Int, val weight: Int)
Person 클래스의 배열도 있고요.
val list = arrayOf(
Person("홍길동", 20, 170, 60),
Person("전우치", 30, 180, 70),
Person("사스케", 40, 160, 50),
Person("나루토", 50, 175, 65),
)
그렇다면, 위 사람들을 나이 순서로 정렬하려면 어떻게 해야 할까요?
list.sortBy { it.age }
코틀린에서는 sortBy 혹은 sortedBy라는 람다식으로
아주 쉽게 정렬을 할 수가 있습니다.
그런데 만약,
더 많은 데이터셋을 보유하고 있고,
이들을 나이 오름차순으로,
나이가 같을 경우 키 내림차순으로,
키가 같을 경우 몸무게 오름차순으로,
몸무게 까지 같다면 이름 사전 오름차순으로 정렬을 해야 한다면...? 생각만 해도 복잡하네요.
하지만 코틀린에서는 sortWith와 compareBy로 아주 쉽게 처리할 수 있습니다.
list.sortWith(
compareBy(
{ it.age }, // 나이 오름차순
{ -it.height }, // 키 내림차순
{ it.weight }, // 몸무게 오름차순
{ it.name } // 이름 사전순
)
)
)
sortWith 메서드는 List 혹은 Array를 정렬하는 메서드로, Comparator를 인자로 받습니다.
compareBy는 Comparator를 생성하는 메서드로, 다중 조건을 사용해 정렬할 수 있게 해주며,
앞에 있을 수록 우선순위가 높습니다.
위 경우, 총 4개 기준으로 정렬을 하게 되는데,
이들은 기본적으로 오름차순 정렬이며, 내림차순 정렬을 하고 싶을 땐 - 를 붙여 내림차순으로 지정할 수 있습니다.
'언어 > Kotlin' 카테고리의 다른 글
코틀린에서는 왜 더 큰 타입으로 자동변환되지 않을까? (0) | 2023.10.16 |
---|---|
코틀린의 반올림 방식 : 오사오입 (0) | 2023.06.14 |
자바의 StringBuilder 개행문자 삽입방법 - append(str + "\n") vs append(str).append("\n") (0) | 2023.02.01 |
[Kotlin] BigDecimal을 사용하여 매우 큰 수, 소숫점 처리하기 (0) | 2022.12.21 |
[Kotlin] Jsoup와 크롤링으로 백준 푼 문제 중 포스팅하지 않은 문제 추려내기 (0) | 2022.11.23 |