Kotlin: ¿forma idiomática de eliminar cadenas duplicadas de la matriz?

105

¿Cómo eliminar duplicados de un Array<String?>in kotlin?

jturolla
fuente
Si alguien está buscando caracteres consecutivos para eliminar, visite handyopinion.com/…
Asad Ali Choudhry

Respuestas:

202

Utilice la distinctfunción de extensión :

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.


Puede resultarle útil:

tecla de acceso rápido
fuente
5
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 :-)
Lucas