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