코틀린 다중 기준 정렬

littlecsh·2024년 6월 8일

kotlin

목록 보기
8/8
post-thumbnail

알고리즘 문제를 풀다가 여러 조건으로 정렬을 해야 하는 경우가 생겼다.

if문으로 조건을 분류시킬 수도 있겠지만 sort라는 간편한 정렬 함수를 버리고 싶지 않아 sort함수처럼 간편하지만 여러가지 조건으로 정렬을 할 수 있는 방법을 찾아보다가 sortWith라는 함수를 발견했다.

참고

  • sort는 Mutable 타입을 정렬할때 사용 / 기존의 데이터를 변형
  • sorted는 Immutable 타입을 정렬할때 사용 / 원본을 변형하지 않고 새로운 리스트를 반환하기 때문에 새로운 변수에 대입해주어야 함

단일 조건 정렬

sort

위에서 언급한 sort의 경우 리스트 요소가 하나의 타입으로 이루어져 있을때, 오름차순으로 정렬을 해주는 함수이다.

val lsit1 = listOf(5, 3, 4, 1, 2)
val result = list1.sorted

=> 결과 : [1,2,3,4,5]

sortBy

하지만 만약 리스트 요소가 하나의 타입이 아닌 여러 객체를 갖고 있고, 하나의 조건으로 분류를 한다면 sortBy(or sortedBy)함수를 사용하면 된다.
"sortBy(정렬조건)" 이러한 형태로 코드를 작성한다면 원하는 순으로 정렬이 가능하다.

val list2 = listOf(
	listOf(4,"abc"),
    listOf(2,"ab"),
    listOf(1,"abcd"),
    listOf(3,"a")
	)
val result = list2.sortedBy(it.last())	// 영문자(마지막요소) 기준으로 lsit2를 정렬

=> 결과 : [[3,"a"], [2,"ab"], [4,"abc"], [1,"abcd"]]

단중 조건 정렬

sortWith

이젠 원래 하고자 했던 여러 기준으로 정렬하는 방법을 알아보자.
이름과 나이로 이루어진 리스트가 있다고 가정해보자.

val lsit3 = lisfOf(
	listOf("김철수", 21),
    listOf("김영희", 20),
    listOf("홍길동", 19),
    listOf("김철수", 20)
	)

이름순으로 오름차순으로 정렬을 하고자 하면 위에서 봤던 sortBy를 이용하면 될것이다.
하지만 이름순으로 정렬하되 이름이 같다면 그 사람들은 나이 기준으로 정렬을 하려고 한다면 sortWith함수와 compareBy를 함께 사용하여 원하는 다중 정렬 기준으로 정렬을 할 수 있다.

val result = list3.sortWith(compareBy({it.first()}, {it.last()}))
// 먼저 이름순(first)으로 정렬 , 이름이 같다면 나이순(last)으로 정렬

=> 결과 : [["김영희", 20], ["김철수", 20], ["김철수", 21], ["홍길동", 19]]
profile
앱개발 튜토리얼

0개의 댓글