본문 바로가기

Kotlin

정렬

오름차순과 내림차순

오름차순 : 1 -> 2 -> 3 -> ... (그래프를 그렸을 때 증가하는 모양)

  • sort() 함수 사용

내림차순 : 9 -> 8 -> 7 -> ...

  • sortDescending() 함수 사용

불변성에 따른 정렬: -ed

sort()

mutable한 데이터집합을 정렬할 때는 sort()를 사용한다

 

sorted()

immutable한 데이터집합을 정렬할 때 -ed가 붙은 sorted()를 사용하면 원본 리스트는 변경하지 않고 정렬된 값을 새로운 리스트에 담아 반환한다.

 

- immutable한 List를 정렬할 때는 : sorted() 사용

- mutable한 MutableList를 정렬할 때는 : sort(), sorted() 둘다 사용 가능 (sorted()의 경우 List로 반환)


정렬 조건 설정 : -With()

sortWith() 

인자로 전달한 compartor(정렬규칙)을 반영하여 자기 자신을 정렬한다

 

sortedWith()

인자로 전달한 compartor(정렬규칙)을 반영하여 정렬한 값을 새 리스트에 담아 반환한다

 

사용 예시

원래 String은 아스키코드 값에 따라 정렬을 하지만 문자열 길이에 따라 정렬하도록 만들기 위해선 

-with() 함수에 정렬조건을 정의한 compartor를 전달한다

    // 기본
    val origin = listOf<String>("abd", "abc", "c", "aa")
    val sorted = origin.sorted()
    println(sorted)

	// -with
    val comparator: Comparator<String> = compareBy { it.length }
    val sortedWith = origin.sortedWith(comparator)
    println(sortedWith)

출력

// 기본
[aa, abc, abd, c]

// -with
[c, aa, abd, abc]

타입이 여러 개일 경우 정렬 : -By()

sortBy(), sortedBy()

리스트 내부 데이터 타입이 여러 개일 때 한가지 정렬 조건을 설정할 수 있다

 

사용 예시

data class Person(val name: String, val age: Int)

fun main() {
	val people = listOf<Person>(
        Person("Joy", 18),
        Person("Jay", 20),
        Person("Cho", 22)
    )
    // 나이로 정렬
    val sortedByAge = people.sortedBy { it.age }
    println(sortedByAge)
    
    // 이름으로 정렬
    val sortedByName = people.sortedBy { it.name }
    println(sortedByName)
}
// 나이 정렬 결과
[Person(name=Joy, age=18), Person(name=Jay, age=20), Person(name=Cho, age=22)]

// 이름 정렬 결과
[Person(name=Cho, age=22), Person(name=Jay, age=20), Person(name=Joy, age=18)]

By와 With의 차이

by : 한 가지 정렬 조건 설정 가능

with : 정렬 조건 여러 개 설정 가능


Array 정렬

  • sort() : 원본 배열 오름차순 정렬
  • sortDescending() : 원본 배열 내림차순 정렬
  • sorted() : 오름차순 정렬한 새 리스트 반환
  • sortedDescending() : 내림차순 정렬한 새 리스트 반환
  • sortedArray() : 오름차순 정렬한 새 배열 반환
  • sortedArrayDescending(): 내림차순 정렬한 새 배열 반환

 

'Kotlin' 카테고리의 다른 글

Flow 결합 연산자 : zip, combine  (0) 2023.04.11
operator fun invoke  (0) 2023.04.10
코루틴 1  (0) 2022.05.12
[Kotlin In Action] 위임  (0) 2022.03.30
연산자 오버로딩  (0) 2021.10.20