Предположим, что
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 " "
}