Kotlin-배열에서 중복 문자열을 제거하는 관용적 방법?


답변:


202

사용 distinct확장 기능 :

val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]

항목을 구별하는 방법을 지정할 수있는 distinctBy기능 도 있습니다.

val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]

따라 @ mfulton26 제안, 당신은 또한 사용할 수 있습니다 toSet, toMutableSet당신이 보존 될 수있는 원래의 순서가 필요하지 않은 경우, 그리고 toHashSet. 이 기능은 생산 Set대신의를 List하고보다 조금 더 효율적이어야한다 distinct.


유용 할 수 있습니다.


5
또한 오버 헤드가 적은 toSet또는 주문이 중요하지 않은 경우 사용할 수 있습니다 . toMutableSetdistincttoHashSet
mfulton26

@ mfulton26, 확실히 항상 오버 헤드가있는 것은 아닙니다. 예를 들어 JPA 엔터티 개체는 지연로드 된 필드를 가질 수 있으므로 전체 비교를 수행하는 것보다 ID별로 컬렉션을 구분하는 것이 더 효율적입니다
Buckstabue

2
@Buckstabue 나는 우리가 두 가지 다른 문제에 대해 이야기하고 있다고 믿습니다 .1) 내부적 으로 사용 하고 반환 값으로 변환 하는 대신 직접 반환하기 때문에 to*Set(공간 및 시간) 더 효율적 이고 2) 는 전체 객체 동등성 비교를 피할 수 있기 때문에 단순한 것보다 더 효율적일 수 있습니다 . 둘 다 유효한 포인트입니다. 나는 "확실히 항상 오버 헤드가없는"나는 그에게 회신하고 비교하고 있음을 간과 것을 당신의 문 실행 과 함께 (그리고distinct[By]SetSetListdistinctBydistinctdistinctdistinctByto*Set ).
mfulton26

1
@ mfulton26, 당신이 맞습니다. 나는 주로 Set보다 List + distinctBy를 사용하는 것이 더 낫다는 것을 의미합니다. Set는 호출하는 데 잠재적으로 비용이 많이들 수있는 equals / hashCode를 집중적으로 사용하기 때문입니다.
Buckstabue

1
글을 쓰는 시점에서 Iterable.distinct실제로 toMutableSet().toList()내부적으로 수행합니다. 그러니 성능에 대해 걱정하지 마세요 :-)
Luke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.