val a = arrayOf("a","a","b","c","c")val b = a.distinct()// ["a", "b", "c"]
También hay una distinctByfunción que permite especificar cómo distinguir los elementos:
val a = listOf("a","b","ab","ba","abc")val b = a.distinctBy { it.length }// ["a", "ab", "abc"]
Como @ mfulton26 sugerido, también se puede utilizar toSet, toMutableSety, si no es necesario el orden original que se conserva, toHashSet. Estas funciones producen a en Setlugar de a Listy deberían ser un poco más eficientes que distinct.
También puede usar toSeto toMutableSetque tienen menos gastos generales que distincty si el pedido no importa, puede usar toHashSet.
mfulton26
@ mfulton26, ciertamente no siempre tiene gastos generales. Por ejemplo, un objeto de entidad JPA puede tener campos cargados de forma diferida, por lo que es más eficiente diferenciar su colección por id que realizar una comparación completa
Buckstabue
2
@Buckstabue Ya veo, creo que estamos hablando de dos problemas diferentes: 1) to*Setes más eficiente (espacio y tiempo) que distinct[By]porque devuelve Setdirectamente en lugar de usar un Setinternamente y convertirlo en un Listvalor de retorno y 2) distinctByes puede ser más eficiente que distinctsimplemente porque puede evitar la comparación completa de igualdad de objetos. Ambos son puntos válidos. Corrí con su declaración de que "ciertamente no siempre tiene gastos generales" y respondí a eso y pasé por alto que se estaba comparando distinctcon distinctBy(y no con to*Set).
mfulton26
1
@ mfulton26, tienes razón. Principalmente quise decir que a veces es mejor usar List + differentBy que Set, porque Set usa intensivamente equals / hashCode que potencialmente podría ser costoso de llamar
Buckstabue
1
Al momento de escribir, en Iterable.distinctrealidad lo hace toMutableSet().toList()internamente. Así que no te preocupes por el rendimiento :-)
Respuestas:
Utilice la
distinct
función de extensión :También hay una
distinctBy
función que permite especificar cómo distinguir los elementos:Como @ mfulton26 sugerido, también se puede utilizar
toSet
,toMutableSet
y, si no es necesario el orden original que se conserva,toHashSet
. Estas funciones producen a enSet
lugar de aList
y deberían ser un poco más eficientes quedistinct
.Puede resultarle útil:
fuente
toSet
otoMutableSet
que tienen menos gastos generales quedistinct
y si el pedido no importa, puede usartoHashSet
.to*Set
es más eficiente (espacio y tiempo) quedistinct[By]
porque devuelveSet
directamente en lugar de usar unSet
internamente y convertirlo en unList
valor de retorno y 2)distinctBy
es puede ser más eficiente quedistinct
simplemente porque puede evitar la comparación completa de igualdad de objetos. Ambos son puntos válidos. Corrí con su declaración de que "ciertamente no siempre tiene gastos generales" y respondí a eso y pasé por alto que se estaba comparandodistinct
condistinctBy
(y no conto*Set
).Iterable.distinct
realidad lo hacetoMutableSet().toList()
internamente. Así que no te preocupes por el rendimiento :-)