Предположим, у меня есть
val dirty = List("a", "b", "a", "c")
Есть ли операция со списком, которая возвращает "a", "b", "c"
Взгляните на ScalaDoc для Seq ,
scala> dirty.distinct res0: List[java.lang.String] = List(a, b, c)
Обновление . Другие предложили использовать Set вместо List. Это нормально, но имейте в виду, что по умолчанию интерфейс Set не сохраняет порядок элементов. Вы можете использовать реализацию Set, которая явно сохраняет порядок, например, collection.mutable.LinkedHashSet .
Set
List
scala.collection.immutable.List теперь имеет метод .distinct.
scala.collection.immutable.List
.distinct
Поэтому вызов dirty.distinct теперь возможен без преобразования в Set или Seq.
dirty.distinct
Seq
Прежде чем использовать решение Kitpon, подумайте об использовании Set вместо List, это гарантирует, что каждый элемент уникален.
Поскольку большинство операций со списками (foreach, map, filter, ...) одинаковы для наборов и списков, изменение коллекции может быть очень простым в коде.
foreach
map
filter
Использование Set во-первых, это верный способ сделать это, но:
scala> List("a", "b", "a", "c").toSet.toList res1: List[java.lang.String] = List(a, b, c)
Работает. Или просто toSet, поскольку он поддерживает интерфейс Seq Traversable.
toSet
Traversable
Алгоритмический способ ...
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 " " }
inArr.distinct foreach println _