Kotlin - Une manière idiomatique de supprimer les chaînes en double du tableau?


Réponses:


201

Utilisez la distinctfonction d'extension :

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

Il existe également une distinctByfonction qui permet de spécifier comment distinguer les éléments:

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

Comme @ mfulton26 suggéré, vous pouvez également utiliser toSet, toMutableSetet, si vous n'avez pas besoin de l'ordre d' origine à conserver, toHashSet. Ces fonctions produisent un Setau lieu de a Listet devraient être un peu plus efficaces que distinct.


Vous pouvez trouver utile:


5
Vous pouvez également utiliser toSetou toMutableSetqui ont moins de frais généraux que distinctet si la commande n'a pas d'importance, vous pouvez utiliser toHashSet.
mfulton26

@ mfulton26, il n'y a certainement pas toujours de surcharge. Par exemple, un objet entité JPA peut avoir des champs chargés paresseusement, il est donc plus efficace de distinguer sa collection par identifiant que d'effectuer une comparaison complète
Buckstabue

2
@Buckstabue Je vois, je crois que nous parlons de deux problèmes différents: 1) to*Setest plus efficace (espace et temps) que distinct[By]parce qu'il renvoie Setdirectement au lieu d'utiliser un en Setinterne et de le convertir en a Listcomme valeur de retour et 2) distinctByest peut être plus efficace que distinctsimplement parce que vous pouvez éviter la comparaison d'égalité d'objet complète. Les deux sont des points valides. J'ai couru avec votre déclaration que "certainement cela n'a pas toujours de surcharge" et je répondais à cela et j'ai oublié que vous compariez distinctavec distinctBy(et pas avec to*Set).
mfulton26

1
@ mfulton26, vous avez raison. Je voulais surtout dire qu'il est parfois préférable d'utiliser List + distinctBy que Set, car Set utilise de manière intensive equals / hashCode qui pourrait potentiellement être coûteux à appeler
Buckstabue

1
Au moment de la rédaction de cet article, le Iterable.distinctfait en toMutableSet().toList()interne. Alors ne vous inquiétez pas pour les performances :-)
Luke
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.