반응형

코틀린은 sort(), sorted() 등의 함수들을 사용하여 기본적인 오름차순 정렬을 진행할 수 있습니다.
sort, sorted을 기반으로 여러 정렬 함수들이 있습니다.
내림차순 정렬을 할 수 있는 sortDescending(), sortedDescending()가 그 중 하나입니다.

sort(), sorted()의 차이

sort()를 사용하여 정렬을 하게되면 원본 리스트(배열) 자체를 오름차순으로 정렬하고
sorted()를 사용하여 정렬을 하게되면 원본은 변하지 않고 오름차순으로 정렬된 리스트(Array도 List로 반환)를 반환합니다.

 

sortDescending()를 사용하여 정렬을 하게되면 원본 리스트(배열) 자체를 내림차순으로 정렬하고

sortedDescending()를 사용하여 정렬을 하게되면 원본은 변하지 않고 내림차순으로 정렬된 리스트(Array도 List로 반환)를 반환합니다.

sort()사용 

fun main() {

    val numList = intArrayOf(7,3,5,1,9,2)
    
    numList.sort()
    numList.forEach {
        print("$it ")
    }
    // 1 2 3 5 7 9 출력
}

sorted() 사용

fun main() {

    val numList = intArrayOf(7,3,5,1,9,2)
    val sortedNumList = numList.sorted()

    numList.forEach {
        print("$it ")
    } // 7 3 5 1 9 2 출력
    println()
    sortedNumList.forEach {
        print("$it ")
    } // 1 2 3 5 7 9 출력

}

sortDescending() 사용

fun main() {

    val numList = intArrayOf(7,3,5,1,9,2)
    val sortedNumList = numList.sortedDescending()

    numList.forEach {
        print("$it ")
    } // 7 3 5 1 9 2  출력
    println()
    sortedNumList.forEach {
        print("$it ")
    } // 9 7 5 3 2 1  출력

}

 

한 가지의 기준을 정하여 정렬 sortedBy(sortBy)

val words = arrayOf(
        "asdf",
        "wewrqwer",
        "sfdgsdfg",
        "ajkcnv",
        "bbbbbb",
        "acaaaa",
    )

위와 같은 Array<String>인 words가 있습니다. 배열 안에 있는 단어들을 정렬하고 싶은데 일반적인 sort로 정렬하게되면 아래와 같은 결과가 발생합니다.

fun main() {
    
    words.sorted().forEach {
        println(it)
    }
    //    acaaaa 
    //    ajkcnv 
    //    asdf 
    //    bbbbbb 
    //    sfdgsdfg 
    //    wewrqwer 출력
}

단어의 앞에서부터 순차적으로 사전의 오름차순으로 정렬이 되는 것을 확인할 수 있습니다.

기본적인 사전순 정렬이 아니라 단어의 길이 순으로 정렬 혹은 n번째 값을 기준으로 정렬과 같은 특정한 기준으로 정렬하기 위하여

sortBy{} 혹은 sortedBy{}를 사용하여 주어진 한 가지 조건을 기준으로 정렬할 수 있습니다.

단어의 길이 순으로 정렬 

fun main() {

    words.sortedBy { it.length }.forEach {
        println(it)
    }

    //    asdf 
    //    ajkcnv
    //    bbbbbb
    //    acaaaa
    //    wewrqwer
    //    sfdgsdfg 출력

}

2번째 인덱스 단어(3번째 단어)를 기준으로 정렬(사전의 오름차순)

fun main() {

    words.sortedBy { it[2] }.forEach {
        println(it)
    }

    //    acaaaa
    //    bbbbbb
    //    asdf
    //    sfdgsdfg
    //    ajkcnv
    //    wewrqwer 출력

}

여러가지 기준들로 정렬 sortedWith(),sortWith()

sortedBy{}를 사용하여 단어의 길이순으로 정렬된 문자열들을 보면
단어의 길이순으로만 정렬이 되어있고 만약 동일한 길이라면 기존에 앞에 있던 문자들이 더 앞쪽으로 정렬되어있는 것을 확인할 수 있습니다. 만약 길이순으로 정렬 후 길이가 같다면 사전순으로 오름차순 정렬. 등과 같이 여러가지 조건으로 정렬하기 위해서는 sortedWith()를 사용할 수 있습니다.

길이순으로 정렬 후 사전순으로 정렬

inline 함수를 사용할 경우

fun main() {

    words.sortedWith(compareBy<String>{it.length}.thenBy { it }).forEach {
        println(it)
    }
    //    asdf
    //    acaaaa
    //    ajkcnv
    //    bbbbbb
    //    sfdgsdfg
    //    wewrqwer 출력

}

inline 함수를 사용하지 않을 경우

fun main() {

    words.sortedWith(compareBy({it.length}, {it})).forEach {
        println(it)
    }
    //    asdf
    //    acaaaa
    //    ajkcnv
    //    bbbbbb
    //    sfdgsdfg
    //    wewrqwer 출력
    
}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기