Dans Scala comment supprimer les doublons d'une liste?
Supposons que j'ai
val dirty = List("a", "b", "a", "c")
Existe-t-il une opération de liste qui renvoie "a", "b", " c "
6 réponses
Regardez le ScalaDoc pour Seq,
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
mise à Jour. D'autres ont suggéré d'utiliser Set
plutôt que List
. C'est bien, mais sachez que par défaut, l'interface Set
ne conserve pas l'ordre des éléments. Vous pouvez utiliser une implémentation Set qui conserve explicitement l'ordre, telle que collection.mutable.LinkedHashSet .
scala.collection.immutable.List
a maintenant une méthode .distinct
.
Donc appeler dirty.distinct
est maintenant possible sans conversion en Set
ou Seq
.
Avant D'utiliser la solution de Kitpon, pensez à utiliser un Set
plutôt qu'un List
, cela garantit que chaque élément est unique.
, Comme la plupart des opérations sur la liste (foreach
, map
, filter
, ...) sont les mêmes pour les ensembles et les listes, changer de collection pourrait être très facile dans le code.
Utiliser Set en premier lieu est la bonne façon de le faire, bien sûr, mais:
scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)
Fonctionne. Ou simplement toSet
car il supporte le Seq Traversable
interface.
La manière algorithmique...
def dedupe(str: String): String = {
val words = { str split " " }.toList
val unique = words.foldLeft[List[String]] (Nil) {
(l, s) => {
val test = l find { _.toLowerCase == s.toLowerCase }
if (test == None) s :: l else l
}
}.reverse
unique mkString " "
}