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 é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 :-)
Réponses:
Utilisez la
distinct
fonction d'extension :Il existe également une
distinctBy
fonction qui permet de spécifier comment distinguer les éléments:Comme @ mfulton26 suggéré, vous pouvez également utiliser
toSet
,toMutableSet
et, si vous n'avez pas besoin de l'ordre d' origine à conserver,toHashSet
. Ces fonctions produisent unSet
au lieu de aList
et devraient être un peu plus efficaces quedistinct
.Vous pouvez trouver utile:
la source
toSet
outoMutableSet
qui ont moins de frais généraux quedistinct
et si la commande n'a pas d'importance, vous pouvez utilisertoHashSet
.to*Set
est plus efficace (espace et temps) quedistinct[By]
parce qu'il renvoieSet
directement au lieu d'utiliser un enSet
interne et de le convertir en aList
comme valeur de retour et 2)distinctBy
est peut être plus efficace quedistinct
simplement 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 compariezdistinct
avecdistinctBy
(et pas avecto*Set
).Iterable.distinct
fait entoMutableSet().toList()
interne. Alors ne vous inquiétez pas pour les performances :-)