정렬 메서드 sort, sorted, sortDescending, sortBy, sortWith에 대해 예시를 들어 정리해보았습니다.
val array = arrayOf("ca", "bc", "ba", "ab")
val list = listOf("ca", "bc", "ba", "ab")
val mutableList = mutableListOf<String>("ca", "bc", "ba", "ab")
val arrayList = arrayListOf<String>("ca", "bc", "ba", "ab")
sort
오름차순으로 정렬합니다.
array.sort()
println(array.contentToString())
// [ab, ba, bc, ca]
// list.sort()
mutableList.sort()
println(mutableList)
// [ab, ba, bc, ca]
arrayList.sort()
println(arrayList)
// [ab, ba, bc, ca]
List는 변경이 불가능하기 때문에 sort, sortDescending, sortBy, sortWith 처럼 해당 컬렉션 자체를 정렬하는 메서드를 사용할 수 없습니다.
대신 해당 컬렉션을 정렬해 새로운 List를 반환하는 메서드 sorted를 사용할 수 있습니다.
sorted
오름차순으로 정렬한 List를 반환합니다.
val sortedList = list.sorted()
println(sortedList)
// [ab, ba, bc, ca]
println(list)
// [ca, bc, ba, ab]
새로운 List를 반환하기 때문에 기존 List의 값에는 변함이 없습니다.
이외에 sortedDescending, sortedBy, sortedByDescending, sortedWith, sortedWithDescending 모두 List를 반환합니다.
주의할 점은 반환 타입이 List이기 때문에 Array, MutableList, ArrayList 타입으로 얻고 싶다면 변환이 필요합니다.
val sortedArray = array.sorted().toTypedArray()
println(sortedArray.contentToString())
// [ab, ba, bc, ca]
val sortedMutableList = mutableList.sorted().toMutableList()
println(sortedMutableList)
// [ab, ba, bc, ca]
val sortedArrayList = arrayList.sorted().toCollection(ArrayList<String>())
println(sortedArrayList)
// [ab, ba, bc, ca]
sortDescending
내림차순으로 정렬합니다.
array.sortDescending()
println(array.contentToString())
// [ca, bc, ba, ab]
mutableList.sortDescending()
println(mutableList)
// [ca, bc, ba, ab]
arrayList.sortDescending()
println(arrayList)
// [ca, bc, ba, ab]
sortByDescending, sortWithDescending, sortedByDescending, sortedWithDescendinge도 내림차순 정렬합니다.
sortBy
특정한 조건을 기준으로 오름차순으로 정렬합니다.
array.sortBy { it[1] }
println(array.contentToString())
// [ca, ba, ab, bc]
mutableList.sortBy { it[1] }
println(mutableList)
// [ca, ba, ab, bc]
arrayList.sortBy { it[1] }
println(arrayList)
// [ca, ba, ab, bc]
예시에서는 원소인 String의 1 인덱스 값을 기준으로 정렬합니다.
두번째 문자가 a, b, c..순으로 정렬되었습니다.
sortedBy는 특정한 조건을 기준으로 오름차순 정렬한 List를 반환합니다.
sortWith
여러 조건을 기준으로 오름차순으로 정렬합니다.
array.sortWith(compareBy({ it[1] }, { it }))
println(array.contentToString())
// [ba, ca, ab, bc]
mutableList.sortWith(compareBy({ it[1] }, { it }))
println(mutableList)
// [ba, ca, ab, bc]
arrayList.sortWith(compareBy({ it[1] }, { it }))
println(arrayList)
// [ba, ca, ab, bc]
원소인 String의 1 인덱스 값을 기준으로 정렬하고, 원소인 String 값 자체를 기준으로 정렬합니다.
앞서 sortBy에서는 원소인 String의 1 인덱스 값만을 기준으로 [ca, ba, ab, bc] 순으로 정렬한 반면, 이번에는 1 인덱스 값이 같은 ca, ba 값도 정렬되어 [ba, ca, ab, bc] 순으로 정렬했습니다.
sortedBy는 여러 조건을 기준으로 오름차순 정렬한 List를 반환합니다.
그런데 예시에서 ca, ba는 1 인덱스 값을 기준으로 하면 같은 a인데 왜 ca, ba 순으로 정렬되었을까요?
stability
모든 정렬 메서드 설명에는 해당 문구가 포함되어 있습니다.
The sort is stable. It means that equal elements preserve their order relative to each other after sorting.
즉, 정렬 기준으로 같은 값일 경우 원래의 순서를 지켜 정렬됩니다.
val array1 = arrayOf("ca", "bc", "ba", "ab")
val array2 = arrayOf("ba", "bc", "ca", "ab")
array1.sortBy { it[1] }
array2.sortBy { it[1] }
println(array1.contentToString())
// [ca, ba, ab, bc]
println(array2.contentToString())
// [ba, ca, ab, bc]
ba가 ca보다 먼저 존재하는 Array는 원소인 String의 1 인덱스 값을 기준으로 정렬 시 ba, ca 순으로 정렬됩니다.
정렬 알고리즘에서 stability에 대한 자세한 설명은 아래를 참고하세요.
https://www.educative.io/answers/what-is-stability-in-sorting-algorithms