컴퓨터 언어/kotlin

Collection 순서 정렬

이건욱 2020. 6. 1. 09:59

개발을 진행을 하다보면 순서 정렬에 대한 기능이 중요합니다.

코틀린에서는 몇가지에 방법을 제공해주고 있습니다.

 

하나는 Comparable을 상속을 받는 방법입니다.

상속을 받아서 compareTo() 함수에 구현을 할수가 있습니다.

class Version(val major: Int, val minor: Int): Comparable<Version> {
    override fun compareTo(other: Version): Int {
        if (this.major != other.major) {
            return this.major - other.major
        } else if (this.minor != other.minor) {
            return this.minor - other.minor
        } else return 0
    }
}

fun main() {    
    println(Version(1, 2) > Version(1, 3))
    println(Version(2, 0) > Version(1, 5))
}
val lengthComparator = Comparator { str1: String, str2: String -> str1.length - str2.length }
println(listOf("aaa", "bb", "c").sortedWith(lengthComparator))
println(listOf("aaa", "bb", "c").sortedWith(compareBy { it.length }))
println(listOf("aaa", "bb", "c").sortedWith(compareBy { it.length }))

 

코틀린에서는 기본적으로 정렬에 관련된 함수를 제공을 합니다. (sorted() , sortedDescending())

val numbers = listOf("one", "two", "three", "four")

println("Sorted ascending: ${numbers.sorted()}")
println("Sorted descending: ${numbers.sortedDescending()}")

Sorted ascending: [four, one, three, two]
Sorted descending: [two, three, one, four]

해당 함수들을 커스텀을 진행할수가 있습니다.

 

함수에 Comparable에 사용될 Selector 함수를 작성하시면 됩니다.

val numbers = listOf("one", "two", "three", "four")

val sortedNumbers = numbers.sortedBy { it.length }
println("Sorted by length ascending: $sortedNumbers")
val sortedByLast = numbers.sortedByDescending { it.last() }
println("Sorted by the last letter descending: $sortedByLast")
val numbers = listOf("one", "two", "three", "four")
println("Sorted by length ascending: ${numbers.sortedWith(compareBy { it.length })}")

코틀린에서는 반대로 검색하는 방법을 제공을 합니다.

 

val numbers = listOf("one", "two", "three", "four")
println(numbers.reversed())

[four, three, two, one]
val numbers = listOf("one", "two", "three", "four")
val reversedNumbers = numbers.asReversed()
println(reversedNumbers)
val numbers = mutableListOf("one", "two", "three", "four")
val reversedNumbers = numbers.asReversed()
println(reversedNumbers)
numbers.add("five")
println(reversedNumbers)

[four, three, two, one]
[five, four, three, two, one]

 

정렬된 순서를 랜덤으로 하고 싶을 때에는 아래와 같이 'shuffled()'을 사용하면 됩니다.

val numbers = listOf("one", "two", "three", "four")
println(numbers.shuffled())