24-04-14 Kotlin 컬렉션 정렬하기
오늘은 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. 오늘 알게 된 것
- 컬렉션을 정렬하는 함수들에 대해 알게되었다.