(kotlin) 코틀린 리스트 정렬하기 | 프로퍼티 2개 이상일 때 (sorted, sortedWith)

자료구조 내 프로퍼티가 2개 일때 정렬로

sort() 또는 sortWith() 2가지만 알면 웬만한 리스트 정렬은 다 처리할 수 있다.

1.Comparable 없이

data class User(
    val name: String,
    val age: Int,
    val favorite: Favorite
)

enum class Favorite(val favorite: String, val number: Int) {
    BIKE("BIKE", 1), SWIM("SWIM", 2), YOUTUBE("YOUTUBE", 3)
}

fun main() {

    val list = mutableListOf<User>().apply {
        add(User("a", 15, Favorite.BIKE))
        add(User("a", 17, Favorite.BIKE))
        add(User("a", 15, Favorite.SWIM))
        add(User("ab", 15, Favorite.BIKE))
        add(User("b", 12, Favorite.SWIM))
        add(User("b", 11, Favorite.YOUTUBE))
        add(User("b", 12, Favorite.BIKE))
        add(User("bc", 15, Favorite.BIKE))
        add(User("c", 9, Favorite.BIKE))
        add(User("c", 5, Favorite.BIKE))
        add(User("c", 15, Favorite.YOUTUBE))
        add(User("a", 13, Favorite.BIKE))
    }

    list.sortWith(compareBy({it.name}, {it.age}, {it.favorite.number}))
    //list.sortWith(compareBy({it.name}, {-it.age}, {it.favorite.number}))
}

sortWith()를 사용하고 프로퍼티를 비교하는데 name->age->favorite.number 순으로 정렬을 진행한다. 기본적으로 오름차순으로 정렬이 된다.

만약 일부 프로퍼티만 내림차순으로 하고 싶다면 -키워드 추가하면 된다.


2.Comparable 사용버전

data class User(
    val name: String,
    val age: Int,
    val favorite: Favorite
): Comparable<User> {

    override fun compareTo(other: User): Int {
        return compareValuesBy(this, other, {it.name}, {it.age}, {it.favorite.number})
        //return compareValuesBy(this, other, {it.name}, {-it.age}, {it.favorite.number})
    }

}

enum class Favorite(val favorite: String, val number: Int) {
    BIKE("BIKE", 1), SWIM("SWIM", 2), YOUTUBE("YOUTUBE", 3)
}

fun main() {

    val list = mutableListOf<User>().apply {
        add(User("a", 15, Favorite.BIKE))
        add(User("a", 17, Favorite.BIKE))
        add(User("a", 15, Favorite.SWIM))
        add(User("ab", 15, Favorite.BIKE))
        add(User("b", 12, Favorite.SWIM))
        add(User("b", 11, Favorite.YOUTUBE))
        add(User("b", 12, Favorite.BIKE))
        add(User("bc", 15, Favorite.BIKE))
        add(User("c", 9, Favorite.BIKE))
        add(User("c", 5, Favorite.BIKE))
        add(User("c", 15, Favorite.YOUTUBE))
        add(User("a", 13, Favorite.BIKE))
    }
    
    list.sort()
    list.forEach { println(it) }
}

Comparable 인터페이스를 구현하고 compareTo를 사용해야 하는 경우가 있다. 빈번하게 일어나는 경우 클래스에 정의를 해놓고 collection.sort() 만 호출하면 정렬이 된다.

만약 일부 프로퍼티만 내림차순으로 하고 싶다면 -키워드 추가하면 된다.



Related Posts