알고리즘 문제를 풀다가 여러 조건으로 정렬을 해야 하는 경우가 생겼다.
if문으로 조건을 분류시킬 수도 있겠지만 sort라는 간편한 정렬 함수를 버리고 싶지 않아 sort함수처럼 간편하지만 여러가지 조건으로 정렬을 할 수 있는 방법을 찾아보다가 sortWith라는 함수를 발견했다.
위에서 언급한 sort의 경우 리스트 요소가 하나의 타입으로 이루어져 있을때, 오름차순으로 정렬을 해주는 함수이다.
val lsit1 = listOf(5, 3, 4, 1, 2)
val result = list1.sorted
=> 결과 : [1,2,3,4,5]
하지만 만약 리스트 요소가 하나의 타입이 아닌 여러 객체를 갖고 있고, 하나의 조건으로 분류를 한다면 sortBy(or sortedBy)함수를 사용하면 된다.
"sortBy(정렬조건)" 이러한 형태로 코드를 작성한다면 원하는 순으로 정렬이 가능하다.
val list2 = listOf(
listOf(4,"abc"),
listOf(2,"ab"),
listOf(1,"abcd"),
listOf(3,"a")
)
val result = list2.sortedBy(it.last()) // 영문자(마지막요소) 기준으로 lsit2를 정렬
=> 결과 : [[3,"a"], [2,"ab"], [4,"abc"], [1,"abcd"]]
이젠 원래 하고자 했던 여러 기준으로 정렬하는 방법을 알아보자.
이름과 나이로 이루어진 리스트가 있다고 가정해보자.
val lsit3 = lisfOf(
listOf("김철수", 21),
listOf("김영희", 20),
listOf("홍길동", 19),
listOf("김철수", 20)
)
이름순으로 오름차순으로 정렬을 하고자 하면 위에서 봤던 sortBy를 이용하면 될것이다.
하지만 이름순으로 정렬하되 이름이 같다면 그 사람들은 나이 기준으로 정렬을 하려고 한다면 sortWith함수와 compareBy를 함께 사용하여 원하는 다중 정렬 기준으로 정렬을 할 수 있다.
val result = list3.sortWith(compareBy({it.first()}, {it.last()}))
// 먼저 이름순(first)으로 정렬 , 이름이 같다면 나이순(last)으로 정렬
=> 결과 : [["김영희", 20], ["김철수", 20], ["김철수", 21], ["홍길동", 19]]