在Scala中,如何从列表中删除重复项?

假设我有

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

是否有一个列表操作返回“a”,“b”,“c”

看看Seq的ScalaDoc,

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

更新 。 其他人则build议使用Set而不是List 。 这很好,但请注意,默认情况下, Set界面不会保留元素顺序。 您可能希望使用显式确保顺序的Set实现,例如collection.mutable.LinkedHashSet 。

scala.collection.immutable.List现在有一个.distinct方法。

所以调用dirty.distinct现在可以不用转换为SetSeq

在使用Kitpon的解决scheme之前,请考虑使用Set而不是List ,它确保每个元素都是唯一的。

由于大多数列表操作( foreachmapfilter ,…)对于集合和列表都是相同的,所以在代码中更改集合可能非常容易。

当然,首先使用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 _

algorithm的方式…

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