Uknow's Lab.
article thumbnail

개발을 하다보면 간혹가다가 배열 혹은 리스트를 정렬할 때,

여러 프로퍼티를 기준으로 정렬을 해야할 때가 있습니다.

 

아래와 같이 이름, 나이, 키, 몸무게를 프로퍼티로 가지는 Person 클래스가 있습니다.

class Person(val name: String, val age: Int, val height: Int, val weight: Int)

 

 

Person 클래스의 배열도 있고요.

    val list = arrayOf(
        Person("홍길동", 20, 170, 60),
        Person("전우치", 30, 180, 70),
        Person("사스케", 40, 160, 50),
        Person("나루토", 50, 175, 65),
    )

 

그렇다면, 위 사람들을 나이 순서로 정렬하려면 어떻게 해야 할까요?

 

 

list.sortBy { it.age }

코틀린에서는 sortBy 혹은 sortedBy라는 람다식으로

아주 쉽게 정렬을 할 수가 있습니다.

 

그런데 만약,

더 많은 데이터셋을 보유하고 있고,

이들을 나이 오름차순으로,

나이가 같을 경우 키 내림차순으로,

키가 같을 경우 몸무게 오름차순으로,

몸무게 까지 같다면 이름 사전 오름차순으로 정렬을 해야 한다면...? 생각만 해도 복잡하네요.

 

하지만 코틀린에서는 sortWith와 compareBy로 아주 쉽게 처리할 수 있습니다.

 

 

list.sortWith(
        compareBy(
            { it.age }, // 나이 오름차순
            { -it.height }, // 키 내림차순
            { it.weight }, // 몸무게 오름차순
            { it.name } // 이름 사전순
        )
    )
)

 

 

sortWith 메서드는 List 혹은 Array를 정렬하는 메서드로, Comparator를 인자로 받습니다.

compareByComparator를 생성하는 메서드로, 다중 조건을 사용해 정렬할 수 있게 해주며,

앞에 있을 수록 우선순위가 높습니다.

 

위 경우, 총 4개 기준으로 정렬을 하게 되는데,

이들은 기본적으로 오름차순 정렬이며, 내림차순 정렬을 하고 싶을 땐 - 를 붙여 내림차순으로 지정할 수 있습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.