Kotlin 컬렉션 정렬 sort, sorted, sortedby, sortDescending, sortWith
1. sort() / sorted()
정렬을 잘 알지 못하고 쓰다보니 어쩔 때는 sort만 되고 어쩔 때는 sorted만 될 때가 있어서 당혹스러울 때가 있었다.
또 정렬을 했는데 왜 안바뀌지? 하고 무지하던 때도 있었다. 😥
이러한 경험을 토대로 이 2개를 위주로 정리해 보기로 했다.
//예시 1
val list = listOf(5,4,8,2,1,10)
list.sort()
// error
//예시 2
val list = listOf(5,4,8,2,1,10)
list.sorted()
println(list)
// [5, 4, 8, 2, 1, 10]
1-1 sort()
- 변경이 가능한 mutable 리스트의 순서를 변경
- 리스트 자체의 순서를 변경 (리턴 x)
val list = mutableListOf(5,4,8,2,1,10)
list.sort()
println(list)
// [1, 2, 4, 5, 8, 10]
1-2 sorted()
- 정렬한 리스트를 리턴
- 기존의 리스트에는 영향이 없음
- 리스트를 리턴하므로 변경이 불가능한 리스트도 가능
val list = listOf(5,4,8,2,1,10)
list.sorted()
println(list)
// [5, 4, 8, 2, 1, 10]
println(list.sorted())
//[1, 2, 4, 5, 8, 10]
→ sort() == 리스트를 정렬 / sorted() == 정렬된 리스트를 리턴
이렇게 간단한 거였는데 제대로 알지 못하니 헷갈리는 것이었다😶
2. sortDescending() / sortedDescending()
- 내림차순 정렬
val list = listOf(5,4,8,2,1,10)
println(list.sortedDescending())
//[10, 8, 5, 4, 2, 1]
val list2 = mutableListOf(5,4,8,2,1,10)
list2.sortDescending()
println(list2)
//[10, 8, 5, 4, 2, 1]
3. sortBy(), sortedBy() / (sortedByDescending(), sortByDescending())
- 지정한 값(요소)를 기준으로 정렬, 조건을 주어 정렬
val list = listOf("떡볶이","순대","튀김","김말이")
println(list.sortedBy { it.length })
//[순대, 튀김, 떡볶이, 김말이]
val list = listOf("떡볶이","순대","튀김","김말이")
println(list.sortedBy { it.length == 2})
//[떡볶이, 김말이, 순대, 튀김]
val list = listOf("떡볶이","순대","튀김","김말이")
println(list.sortedBy { it.length == 3})
//[순대, 튀김, 떡볶이, 김말이]
val list = listOf("떡볶이","순대","튀김","김말이")
println(list.sortedByDescending { it.length == 3})
//[떡볶이, 김말이, 순대, 튀김]
Q. 만약 제대로된 조건을 주지 않는다면?
val list = listOf("떡볶이","순대","튀김","김말이")
println(list.sortedBy { it.length == 4})
//[떡볶이, 순대, 튀김, 김말이]
에러는 나지 않으나 당연하게도 제대로 동작을 하지 못한다 ㅎㅎ
4. sortWith() / sortedWith()
- Comparator을 파라미터로 받아 다중 방법으로 정렬
- 정보가 여러개 있을 경우, 그 중 조건이 여러개 필요한 경우
- Comparator → 두 인수를 받아 비교
abstract fun compare(a: T, b: T): Int
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-comparator/compare.html
compare - Kotlin Programming Language
kotlinlang.org
compare - Kotlin Programming Language
kotlinlang.org
- kotlin.comparisons의 다양한 기능
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.comparisons/
data class Student(var classNumber: Int, var name:String)
val list = mutableListOf<Student>().apply{
add(Student(3,"Jane"))
add(Student(2,"Gabriel"))
add(Student(1,"Daisy"))
add(Student(1,"Wendy"))
add(Student(2,"Aaron"))
add(Student(3,"Walter"))
}
list.sortWith(compareBy({it.classNumber},{it.name}))
println(list)
//[Student(classNumber=1, name=Daisy), Student(classNumber=1, name=Wendy), Student(classNumber=2, name=Aaron), Student(classNumber=2, name=Gabriel), Student(classNumber=3, name=Jane), Student(classNumber=3, name=Walter)]
list.sortWith(compareBy({it.name},{it.classNumber}))
println(list)
//[Student(classNumber=2, name=Aaron), Student(classNumber=1, name=Daisy), Student(classNumber=2, name=Gabriel), Student(classNumber=3, name=Jane), Student(classNumber=3, name=Walter), Student(classNumber=1, name=Wendy)]