개발 공부/kotlin

Kotlin 컬렉션 정렬 sort, sorted, sortedby, sortDescending, sortWith

yong_DD 2022. 7. 3. 15:23

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