Android 개발/Kotlin

compareBy 와 min 그리고 sortedWith 사용방법에 대한 정리

Developer88 2023. 5. 10. 00:01
반응형

오늘은 리스트를 sorting 할 때 사용할 수 있는,

compareBy 와 min 그리고 sortedWith를 사용하는 방법에 대해서 정리해 보겠습니다.

 

1. 최소값을 찾을 때 2가지 조건을 붙이는 방법에 사용

먼저 CompareBy 와 min 을 사용하는 방법에 대해서 정리해 보겠습니다.

아래 코드에서 사용한 것은 minWithOrNull 인데요.

 

코드를 먼저 보고 정리해 보겠습니다.

compareBy에 두가지 조건 블록이 들어가 있습니다.

이 조건은 아래와 같이 적용됩니다.

  1. 먼저 value 가 적은 최소값을 찾고,
  2. 다음으로 id가 적은 값을 찾는다 입니다.

 

data class SampleData(val id: Int, val value: Int)

val dataList = listOf(
    SampleData(1, 10),
    SampleData(2, 15),
    SampleData(3, 10),
    SampleData(4, 7),
    SampleData(5, 7)
)

val minElement = dataList.minWithOrNull(compareBy({ it.value }, { it.id }))

println(minElement)

 

광고

 

실행결과를 보겠습니다.

value 중에서 작은 것중, id가 가장 작은, id4의 객체가 결과로 출력되었습니다.

 

 

이렇게 여러개의 조건을 붙여줄 수 있는 것은,

compareBy 함수가 있기 때문인데요.

 

여러개의 프로퍼티를 가진 객체를 비교할 때 사용하기 좋습니다.

첫번째 인자로 넣어준 블록이 동일한 결과가 나오면,

2번째, 그래도 동일하면, 세번째 이런식으로 순차적으로 조건을 비교해 줍니다.

 

 

2. SortedWith 와 CompareBy 의 사용

Collection 을 Sort 해서 리턴해주는 CompareBy 와도 사용하기 정말 좋은 것이 CompareBy 인데요.

위에서와 마찬가지로, 첫번째 조건에서 동일한 값이 발견되면,

두번째 조건을 Sort 해 줍니다.

 

data class Student(val name: String, val score: Int, val age: Int)

val studentList = listOf(
    Student("김군", 90, 20),
    Student("박군", 85, 22),
    Student("이군", 90, 19),
    Student("정군", 85, 21)
)

val studentComparator = compareBy<Student>({ it.score }, { it.age })
val sortedList = studentList.sortedWith(studentComparator)

println(sortedList)

 

광고

 

결과는 다음과 같이,

점수가 가장 낮으면서도 나이가 어린 정군이 결과에 가장 먼저 나타나게 됩니다.

 

[Student(name=정군, score=85, age=21), Student(name=박군, score=85, age=22), Student(name=이군, score=90, age=19), Student(name=김군, score=90, age=20)]

 

이상으로, compareBy 와 min 그리고 sortedWith에 대해서 정리해 보았습니다.

728x90