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 "

79
demandé sur deltanovember 2011-08-21 04:41:20

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 .

149
répondu Kipton Barros 2011-08-21 22:56:15

scala.collection.immutable.List a maintenant une méthode .distinct.

Donc appeler dirty.distinct est maintenant possible sans conversion en Set ou Seq.

15
répondu crockpotveggies 2014-01-22 21:58:58

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.

14
répondu paradigmatic 2011-08-21 23:04:34

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.

5
répondu zentrope 2011-08-21 23:01:18

InArr.distinctes foreach println _

-1
répondu Sumit Pal 2014-03-04 23:28:12

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 " "
}
-3
répondu Farquad 2015-09-21 06:37:27