오늘 배운 것

24-04-14 Kotlin 컬렉션 정렬하기

무무11 2024. 4. 14. 19:14

오늘은 Kotlin에서 컬렉션을 정렬하는 법과 함수들에 대해 정리해보았다.

 

1. Kotlin 컬렉션 정렬하기

먼저 컬렉션을 정렬하는 함수들을 사용하려면 컬렉션 내의 요소들이 서로 비교가능해야 한다.

 

숫자는 기본적으로 오름차순으로 정렬되고, 알파벳은 사전순으로 정렬된다.

1-1. sorted(), sortedDescending(), sort(), sortDescending()

sorted()는 정렬된 리스트를 새롭게 반환한다. sortedDesending()은 내림차순으로 정렬된 리스트를 새롭게 반환한다.

 

코드를 작성해서 실제 예시를 보는 것이 이해하기가 더 쉽다.

fun main() {
    val alphabets = listOf("E", "B", "C", "A", "D")
    val numbers = listOf(0, 100, -10, -100, 10)

    val sortedAlphabets = alphabets.sorted()
    val sortedNumbers = numbers.sorted()

    println(sortedAlphabets) // [A, B, C, D, E]
    println(sortedNumbers) // [-100, -10, 0, 10, 100]


    val sortedDescendingAlphabets = alphabets.sortedDescending()
    val sortedDescendingNumbers = numbers.sortedDescending()

    println(sortedDescendingAlphabets) // [E, D, C, B, A]
    println(sortedDescendingNumbers) // [100, 10, 0, -10, -100]
}

위와 같이 sorted()와 sortedDescending()은 컬렉션의 요소들이 정렬된 리스트를 새롭게 반환하는 것을 볼 수 있다.

 

반면 sort()와 sortDescending()은 새로운 리스트를 반환하는 것이 아니라 컬렉션의 요소들을 정렬하는 함수들이다. 컬렉션 자체가 변하기 때문에 불변형의 컬렉션에는 이 두 함수를 사용할 수 없다.

fun main() {
    val alphabets = listOf("E", "B", "C", "A", "D")
    val numbers = mutableListOf(0, 100, -10, -100, 10)

    // alphabets.sort() 불변형이기 때문에 컴파일이 불가능하다
    numbers.sort()

    println(numbers) // [-100, -10, 0, 10, 100]

    numbers.sortDescending()

    println(numbers) // [100, 10, 0, -10, -100]
}

1-2. sortedBy(), sortedByDescending(), sortBy(), sortByDescending()

sortedBy()와 sortedByDescending()를 이용하면 람다를 컬렉션의 요소에 적용해 순서를 적용할 수 있다.

fun main() {
    val nutrition = listOf("단백질", "철", "탄수화물", "칼슘", "콜레스테롤")

    // 컬렉션 내 요소의 문자열 길이 순으로 정렬하기
    println(nutrition.sortedBy { it.length }) // [철, 칼슘, 단백질, 탄수화물, 콜레스테롤]
    println(nutrition.sortedByDescending { it.length }) // [콜레스테롤, 탄수화물, 단백질, 칼슘, 철]
}

sortBy()와 sortByDescending() 역시 람다를 컬렉션에 요소에 적용해 순서를 적용한다. 다만 새로운 리스트를 반환하는 것이 아니라 원래의 컬렉션에 정렬된 컬렉션이 들어가게된다.

fun main() {
    val nutrition = mutableListOf("단백질", "철", "탄수화물", "칼슘", "콜레스테롤")

    // 컬렉션 내 요소의 문자열 길이 순으로 정렬하기
    nutrition.sortBy { it.length }
    println(nutrition) // [철, 칼슘, 단백질, 탄수화물, 콜레스테롤]

    nutrition.sortByDescending { it.length }
    println(nutrition) // [콜레스테롤, 탄수화물, 단백질, 칼슘, 철]
}

 

1-3. sortedArray(), sortedArrayDescending()

위에서 정리한 함수들을 배열에 사용하면 원래의 컬렉션을 변화시키거나 새로운 리스트를 반환했다. 만약 새로운 배열을 반환받고 싶을 때에는 sortedArray()와 sortedArrayDescending()을 사용할 수 있다.

fun main() {
    val alphabets = arrayOf("E", "B", "C", "A", "D")
    val numbers = arrayOf(0, 100, -10, -100, 10)

    val sortedAlphabets = alphabets.sortedArray()
    val sortedNumbers = numbers.sortedArray()

    println(sortedAlphabets.contentToString())
    // [A, B, C, D, E]
    println(sortedNumbers.contentToString())
    // [-100, -10, 0, 10, 100]

    val sortedDescendingAlphabets = alphabets.sortedArrayDescending()
    val sortedDescendingNumbers = numbers.sortedArrayDescending()

    println(sortedDescendingAlphabets.contentToString())
    // [E, D, C, B, A]
    println(sortedDescendingNumbers.contentToString())
    // [100, 10, 0, -10, -100]
}

 

오늘 모두 정리해보고 싶었지만 생각보다 정리할 내용이 많아 아쉽게 전부 하지는 못했다. 시간이 된다면 내일 마저 정리해 보아야겠다.

2. 오늘 알게 된 것

- 컬렉션을 정렬하는 함수들에 대해 알게되었다.