Supposons que j'ai
val dirty = List("a", "b", "a", "c")
Existe-t-il une opération de liste qui renvoie "a", "b", "c"
Jetez un œil au ScalaDoc pour Seq ,
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
Mettre à jour . D'autres ont suggéré d'utiliser Set
plutôt que List
. C'est bien, mais sachez que par défaut, l' Set
interface ne conserve pas l'ordre des éléments. Vous pouvez utiliser un ensemble implémentation qui explicitement ne préserver l' ordre, comme collection.mutable.LinkedHashSet .
Map[String, File]
, où les clés font partie du nom de fichier qui vous intéresse. Une fois la carte construite, vous pouvez appeler lavalues
méthode pour obtenir uneIterable
valeur de - les clés seront toutes distinctes par construction.groupBy
membre descala.collection.Iterable[A]
.scala.collection.immutable.List
a maintenant une.distinct
méthode.Ainsi, l'appel
dirty.distinct
est désormais possible sans conversion en unSet
ouSeq
.la source
.distinct
n'est pas défini pourscala.collection.Iterable[A]
. Donc, dans ce cas, vous devez utiliser la misedirty
à niveau vers aSeq
ou a deSet
toute façon (c'est-à-dire en utilisant l'un ou l' autre.toList
,.toSeq
ou les.toSet
membres) pour que cela fonctionne.Avant d'utiliser la solution de Kitpon, pensez à utiliser a
Set
plutôt que aList
, cela garantit que chaque élément est unique.Comme la plupart des opérations de liste (
foreach
,map
,filter
, ...) sont les mêmes pour les jeux et les listes, la collecte pourrait changer très facile dans le code.la source
Utiliser Set en premier lieu est la bonne façon de le faire, bien sûr, mais:
Travaux. Ou tout
toSet
comme il prend en charge leSeqTraversable
interface.la source
Set
outilsTraversable
, nonSeq
. La différence est queSeq
garantit un ordre aux éléments, alors que ceTraversable
n'est pas le cas.Pour les listes déjà triées
Si vous souhaitez que les éléments distincts d'une liste dont vous savez qu'ils sont déjà triés , comme j'en ai souvent eu besoin, ce qui suit fonctionne environ deux fois plus vite que
.distinct
:Résultats de performance sur une liste de 100 000 000 d'Ints aléatoires de 0 à 99:
Performances avec MutableList ou ListBuffer
Alors qu'il semblerait qu'une approche de programmation plus modifiable / non fonctionnelle puisse être plus rapide que le préfixe à une liste immuable, la pratique montre le contraire. L'implémentation immuable fonctionne toujours mieux. Je suppose que la raison est que scala concentre ses optimisations de compilateur sur des collections immuables et fait du bon travail. (J'encourage les autres à soumettre de meilleures implémentations.)
Implémentations:
Tester:
la source
inArr.distinct foreach println _
la source
La manière algorithmique ...
la source