Как в Scala удалить дубликаты из списка? - PullRequest
85 голосов
/ 21 августа 2011

Предположим, у меня есть

val dirty = List("a", "b", "a", "c")

Есть ли операция со списком, которая возвращает "a", "b", "c"

Ответы [ 6 ]

157 голосов
/ 21 августа 2011

Взгляните на ScalaDoc для Seq ,

scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)

Обновление . Другие предложили использовать Set вместо List. Это нормально, но имейте в виду, что по умолчанию интерфейс Set не сохраняет порядок элементов. Вы можете использовать реализацию Set, которая явно сохраняет порядок, например, collection.mutable.LinkedHashSet .

16 голосов
/ 23 января 2014

scala.collection.immutable.List теперь имеет метод .distinct.

Поэтому вызов dirty.distinct теперь возможен без преобразования в Set или Seq.

14 голосов
/ 21 августа 2011

Прежде чем использовать решение Kitpon, подумайте об использовании Set вместо List, это гарантирует, что каждый элемент уникален.

Поскольку большинство операций со списками (foreach, map, filter, ...) одинаковы для наборов и списков, изменение коллекции может быть очень простым в коде.

6 голосов
/ 22 августа 2011

Использование Set во-первых, это верный способ сделать это, но:

scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)

Работает. Или просто toSet, поскольку он поддерживает интерфейс Seq Traversable.

0 голосов
/ 21 сентября 2015

Алгоритмический способ ...

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 " "
}
0 голосов
/ 05 марта 2014

inArr.distinct foreach println _

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...