在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
现在可以不用转换为Set
或Seq
。
在使用Kitpon的解决scheme之前,请考虑使用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 _
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 " " }