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ê 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 :-)
Respostas:
Use a
distinct
função de extensão :Também existe uma
distinctBy
função que permite especificar como distinguir os itens:Como @ mfulton26 sugerido, você também pode usar
toSet
,toMutableSet
e, se você não precisa a ordenação original a ser preservado,toHashSet
. Essas funções produzem um emSet
vez de aList
e devem ser um pouco mais eficientes do quedistinct
.Você pode achar útil:
fonte
toSet
outoMutableSet
que têm menos sobrecarga do quedistinct
e se o pedido não importa, você pode usartoHashSet
.to*Set
é mais eficiente (espaço e tempo) do quedistinct[By]
porque retorna oSet
diretamente em vez de usar umSet
internamente e convertê-lo em umList
como seu valor de retorno e 2)distinctBy
é pode ser mais eficiente do quedistinct
simplesmente 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 comparandodistinct
comdistinctBy
(e não comto*Set
).Iterable.distinct
na verdade o faztoMutableSet().toList()
internamente. Portanto, não se preocupe com o desempenho :-)