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


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:


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.