Kotlin 에서 여러 조건을 가지고 distinct 하는 방법을 알아봅니다.
객체내 여러 필드를 가지고 조건을 따져 중복된 결과를 걸러내봅니다.
Goal
- distinct 를 여러조건으로 하는방법을 알아봅니다.
테스트할 객체
1 |
|
2개의 조건을 테스트
Pair 를 이용합니다.
1 |
|
- 만약
name
과NickName
이 모두 같은 사람들은 중복처리한다고 생각해보겠습니다. - 이경우에는
list.distinctBy {Pair(it.name, it.nickName)}
와 같이, 중복된 것으로 처리할것들을 Pair 로 묶어서 넣어주면됩니다.
distinct 는 Selector 로 처리됩니다.
1 |
|
diffAge
객체의 경우에는 다른 Age 를 가지고 있으나, 중복된 Man 으로 처리된것을 볼 수 있습니다.- 왜냐하면
distinctBy
안에 들어가는것은 selector 로, 들어간 필드들의 값이 같으면 중복 처리를 하기 떄문입니다. - 즉
distinctBy
안에 조건식을 넣어서는 안됩니다.(ex nickName == "goodall")
결과로 남는 객체의 순서
list 순서상 앞에 있던 객체가 남습니다.
1 |
|
age = 30
이 객체가 list 안에 순서상 먼저 들어가있었기 때문에,age = 20
가 제거된것을 확인할 수 있습니다.
3개 이상의 조건을 필터링 하는 경우
listOf(field1, field2, field3)
1 |
|
- pair 로 처리될 수 없는 3개이상의 경우,
Triple(3개 인경우)
,listOf()
로 처리해주면됩니다.
Conclusion
distinctBy
를 이용해 N개의 필드값 을 따져서 중복을 제거할 수 있다.- 비교할 필드가 2개인경우,
Pair
, 그 이상의 경우에는listOf
를 이용해 처리할 수 있다.
Reference
- https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/distinct-by.html
- https://stackoverflow.com/questions/45883719/how-can-i-remove-duplicate-objects-with-distinctby-from-a-list-in-kotlin