[Kotlin] 리스트 정렬(sort, sortBy, sortWith)

hee09·2022년 2월 25일
0
post-thumbnail

코틀린 정렬 방법

  1. Immutable 리스트 정렬
  2. Mutable 리스트 정렬
  3. 역순으로 정렬
  4. sortedWith(), sortWith()
  5. sortedBy, sortBy()

Immutable 리스트 정렬

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]

Mutable 리스트 정렬

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]

sortedWith(), sortWith()

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]

sortedBy(), sortBy()

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)]

결론

  • sorted와 같이 "~~ed"가 들어간 정렬 메소드는 Immutable, Mutable 리스트에 모두 사용할 수 있고, 메소드가 적용된 새로운 리스트를 반환합니다.
  • sort와 같은 정렬 메소드는 Mutable 리스트에 사용할 수 있고, 메소드를 리스트 자기 자신에게 적용합니다.

참조
Kotlin - 리스트 정렬 방법(sort, sortBy, sortWith)
Kotlin - 컬렉션 정렬

틀린 부분은 댓글로 남겨주시면 수정하겠습니다..!!

profile
되새기기 위해 기록

0개의 댓글