Kotlin - Maneira idiomática de remover strings duplicadas do array?

102

Como remover duplicatas de um Array<String?>em kotlin?

Jturolla
fonte
Se alguém estiver procurando por caracteres consecutivos para remover, visite handyopinion.com/…
Asad Ali Choudhry

Respostas:

197

Use a distinctfunção de extensão :

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

Também existe uma distinctByfunção que permite especificar como distinguir os itens:

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

Como @ mfulton26 sugerido, você também pode usar toSet, toMutableSete, se você não precisa a ordenação original a ser preservado, toHashSet. Essas funções produzem um em Setvez de a Liste devem ser um pouco mais eficientes do que distinct.


Você pode achar útil:

tecla de atalho
fonte
5
Você também pode usar toSetou toMutableSetque têm menos sobrecarga do que distincte se o pedido não importa, você pode usar toHashSet.
mfulton26
@ mfulton26, certamente nem sempre tem sobrecarga. Por exemplo, um objeto de entidade JPA pode ter campos carregados lentamente, então é mais eficiente distinguir sua coleção por id do que realizar uma comparação completa
Buckstabue
2
@Buckstabue vejo, acredito que estamos falando sobre dois problemas diferentes: 1) to*Seté mais eficiente (espaço e tempo) do que distinct[By]porque retorna o Setdiretamente em vez de usar um Setinternamente e convertê-lo em um Listcomo seu valor de retorno e 2) distinctByé pode ser mais eficiente do que distinctsimplesmente porque você pode evitar a comparação completa da igualdade do objeto. Ambos são pontos válidos. Corri com sua declaração de que "certamente nem sempre tem sobrecarga" e estava respondendo a isso e esqueci que você estava comparando distinctcom distinctBy(e não com to*Set).
mfulton26
1
@ mfulton26, você está correto. Eu principalmente quis dizer que às vezes é melhor usar List + DistinBy do que Set, porque Set usa intensivamente equals / hashCode, que pode ser caro para ligar
Buckstabue
1
No momento da escrita, Iterable.distinctna verdade o faz toMutableSet().toList()internamente. Portanto, não se preocupe com o desempenho :-)
Lucas