sorted()
함수는 데이터 변경이 안되는 리스트(Immutable List)를 정렬할 때 사용합니다. sorted()
는 리스트의 원본을 변경하지 않고, 정렬된 리스트를 생성하여 리턴합니다. 아래는 Immutable 리스트를 sorted()
로 정렬하는 예제입니다.
val list = listOf(20, 100, 5, 60, 40)
val sortedList = list.sorted()
println("List : $list")
println("SortedList : $sortedList")
List : [20, 100, 5, 60, 40]
SortedList : [5, 20, 40, 60, 100]
sort()
는 데이터 변경이 가능한 리스트(Mutable List)를 정렬할 때 사용합니다. 리스트 자신이 갖고 있는 요소의 순서를 변경합니다. 아래는 Mutable 리스트를 sort()
로 정렬하는 예제입니다.
val mutableList = mutableListOf(20, 100, 5, 60, 40)
mutableList.sort()
println("MutableList : $mutableList")
MutableList : [5, 20, 40, 60, 100]
리스트가 Immutable이냐, Mutable이냐에 따라서 역순으로 정렬하는 메소드가 다릅니다. 위에서 사용한 sorted(), sort() 함수의 차이와 같습니다.
reversed()
: Immutable 리스트에 사용합니다. 역순으로 변경된 리스트를 생성하고 리턴합니다.reverse()
: Mutable 리스트에 사용하며, 리스트 자신의 요소 순서를 반대로 변경합니다.// Immutable List
val list = listOf(20, 100, 5, 60, 40)
val reversedSortedList = list.sorted().reversed()
println("reversedSortedList : $reversedSortedList")
// Mutable List
val mutableList = mutableListOf(20, 100, 5, 60, 40)
mutableList.sort()
mutableList.reverse()
println("reversedMutableList : $mutableList")
reversedSortedList : [100, 60, 40, 20, 5]
reversedMutableList : [100, 60, 40, 20, 5]
sortWith()
는 정렬 규칙으로 Comparator를 지정할 수 있습니다. 즉, Comparator를 변경해 자신이 원하는 조건으로 리스트를 정렬하는 것입니다.
이 또한 reverse()와 마찬가지로 리스트가 Immutable, Mutable이냐에 따라서 사용하는 메소드가 다릅니다.
sortedWith()
: Immutable List에 사용 -> sorted()와 마찬가지로 정렬된 새로운 리스트를 반환sortWith()
: Mutable List에 사용 -> sort()와 마찬가지로 자기 자신을 정렬String을 sorted
로 정렬하면 기본적으로 문자열의 ASCII 값을 비교해 정렬합니다. 만약 아래와 같이 문자열의 길이로 정렬하고 싶다면 Comparator를 직접 구현하여 sortedWith()
에 인자로 전달할 수 있습니다. 코드에서는 Comparator를 생성할 때 compareBy
의 Lambda에 비교할 객체가 리턴되도록 만들었 습니다.
val list = listOf("aaaaa", "bbbb", "ccc", "dd", "e")
val alphabetOrder = list.sorted()
println("Alphabet order : $alphabetOrder")
val comparator: Comparator<String> = compareBy<String> { it.length }
val lengthOrder = list.sortedWith(comparator)
println("Length order : $lengthOrder")
Alphabet order : [aaaaa, bbbb, ccc, dd, e]
Length order : [e, dd, ccc, bbbb, aaaaa]
sortBy()
는 리스트 요소가 1 개의 데이터 타입으로 이루어지지 않고, 내부에 여러 객체를 갖고 있는 타입일 때, 어떤 객체를 비교해서 정렬할 지 결정할 때 사용합니다.
sortedBy()
: Immutable List에서 사용 -> sorted()와 마찬가지로 정렬된 새로운 리스트를 반환sortBy()
: Mutable List에서 사용 -> Mutable List에 사용 -> sort()와 마찬가지로 자기자신을 정렬아래의 코드에서 list는 Pair를 요소로 갖고 있습니다. Pair는 두 개의 객체를 저장할 수 있는 클래스이며, 어떤 요소를 정렬할지를 sortBy()
로 선택할 수 있습니다. sortBy { it.first }
는 Pair의 첫 번째 요소로 정렬하고, sortBy { it.second }
는 두 번째 요소로 정렬을 수행합니다.
val mutableList = mutableListOf("b" to 5, "a" to 10, "d" to 7, "c" to 1)
println("mutableList : $mutableList")
mutableList.sortBy { it.first }
println("sortByFirst : $mutableList")
mutableList.sortBy { it.second }
println("sortBySecond : $mutableList")
mutableList : [(b, 5), (a, 10), (d, 7), (c, 1)]
sortByFirst : [(a, 10), (b, 5), (c, 1), (d, 7)]
sortBySecond : [(c, 1), (b, 5), (d, 7), (a, 10)]
참조
Kotlin - 리스트 정렬 방법(sort, sortBy, sortWith)
Kotlin - 컬렉션 정렬
틀린 부분은 댓글로 남겨주시면 수정하겠습니다..!!