sortWith + 사용자정의 comparator
var arr1 = mutableListOf(5,4,2,7,1)
arr1.sortWith{a,b-> b.compareTo(a)} // [7, 5, 4, 2, 1]
var arr2 = mutableListOf<Pair<Int,Int>>(Pair(1,3),Pair(2,5),Pair(2,4),Pair(6,2))
arr2.sortWith{ a, b ->
var k:Int = a.first.compareTo(b.first)
when(k){
0 -> a.second.compareTo(b.second)
else -> k
}
} // [(1, 3), (2, 4), (2, 5), (6, 2)]
println(arr1.toString())
println(arr2.toString())
알고리즘 문제를 풀 때 문제에 따라 사용자 정의 comparator를 전달해서 정렬을 해야하는 경우가 종종 있습니다.
C++에서와 비슷하게 코틀린에서도 컬렉션 sortWith 메소드에 Comparator 구현체를 전달하면 사용자가 원하는 방식으로 정렬을 할 수 있습니다.
Pair도 역시 C++과 비슷한 방식으로 정렬이 가능합니다.
sortWith + compareBy / sortedBy
fun main(){
var arr1 = mutableListOf<Pair<Int,Int>>(Pair(6,2),Pair(2,5),Pair(2,4),Pair(1,3))
arr1.sortWith(compareBy({it.first},{it.second}))
var arr2 = mutableListOf<Pair<Int,Int>>(Pair(6,2),Pair(2,5),Pair(2,4),Pair(1,3))
var parr2 = arr2.sortedBy{it.second}.sortedBy{it.first}
println(arr1.toString()) // [(1, 3), (2, 4), (2, 5), (6, 2)]
println(parr2.toString()) // [(1, 3), (2, 4), (2, 5), (6, 2)]
}
우와 같이 sortWith에 comparator를 return해주는 compareBy를 전달하는 방법도 있습니다.
compareBy({1순위로 비교할 프로퍼티},{2순위로 비교할 프로퍼티}....) 처럼 넣어주면 됩니다.
위 예제에서는 it.frst, it.second를 순서로 전달함으로써 first를 우선으로 비교하고, 같으면 second로 비교해서 오름차순으로 정렬하라는 의미입니다.
sortedBy를 이용하는 방법도 있습니다.
sortedBy{비교할 프로퍼티} 으로 써주면 적어준 프로퍼티 기준으로 오름차순 정렬합니다.
arr2에서 해주는 것과 같이 pair의 second부터 정렬해주고, first를 정렬하면 first를 1순위, second를 2순위로 비교해서 정렬하는 것과 같은 효과입니다.
'Problem-Solving > 코틀린으로 PS하기' 카테고리의 다른 글
다차원 배열 (0) | 2021.08.08 |
---|---|
Map (0) | 2021.07.18 |
우선순위큐 (PriorityQueue) (0) | 2021.07.15 |