В Scala как удалить дубликаты из списка?

Предположим, что

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

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

Ответ 1

Посмотрите на ScalaDoc для Seq,

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

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

Ответ 2

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

Таким образом, вызов dirty.distinct теперь возможен без преобразования в Set или Seq.

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

inArr.distinct foreach println _

Ответ 6

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

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 " "
}