이번에 List<Pair<Int, Int>> 타입을 정렬해 줄 경우가 생겨서 알아보게 된 내용이다. 정확히는 Map<Int, Int> 자료 구조를 value - key 순으로 정렬하고자 했는데 Map의 아이템으로 Pair가 사용되기 때문에 같은 내용으로 생각해도 될 것 같다.

Pair는 2개의 아이템이 하나의 쌍으로 되어있는 자료 구조인데, 첫 번째 아이템을 first, 두 번째 아이템을 second 라고 하자. (first, second로 각각 첫 번째, 두 번째 아이템에 접근할 수 있다)

이때 second를 기준으로 정렬 후 second 값이 같은 것끼리는 first를 기준으로 정렬하고자 한다.

sortedWith


많이 사용하는 sortedBy와 달리 sortedWithcomparator를 지정해서 다중 조건을 둘 수 있다는 장점이 있다. 이러한 특징 때문에 Pair의 두 아이템을 각각 기준으로 만들어 주기 위해서 sortedWith를 사용했다.

방법은 간단하다.

fun main() {
    val simpleMap = mutableMapOf<Int, Int>(
        1 to 10,
        2 to 20,
        3 to 30,
        4 to 30,
        5 to 30
    )
    val sortedMap = simpleMap.toList().sortedWith(compareBy({ it.second }, { it.first }))
    println(sortedMap) // [(1, 10), (2, 20), (3, 30), (4, 30), (5, 30)]
}

정렬된 값 중 가장 큰 값을 구하는 방법은 다음과 같다.

fun main() {
    val simpleMap = mutableMapOf<Int, Int>(
        1 to 10,
        2 to 20,
        3 to 30,
        4 to 30,
        5 to 30
    )
    val largestMap = simpleMap.toList().sortedWith(compareBy({ it.second }, { it.first })).last()
    println(largestMap) // (5, 30)
}

그냥 마지막 아이템만 취해주면 된다.

내림차순으로 정렬하기 위한 방법은 다음과 같다.

fun main() {
    val simpleMap = mutableMapOf<Int, Int>(
        1 to 10,
        2 to 20,
        3 to 30,
        4 to 30,
        5 to 30
    )
    val reverseSortedMap = simpleMap.toList().sortedWith(compareBy({ it.second }, { it.first })).asReversed()
    println(reverseSortedMap) // [(5, 30), (4, 30), (3, 30), (2, 20), (1, 10)]
}