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

del*_*ber 88 scala

假设我有

val dirty = List("a", "b", "a", "c")
Run Code Online (Sandbox Code Playgroud)

是否有返回"a","b","c"的列表操作

Kip*_*ros 166

看看Seq的ScalaDoc ,

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

更新.其他人建议使用Set而不是List.没关系,但请注意,默认情况下,Set界面不保留元素顺序.您可能需要使用一组实施,明确维持秩序,如collection.mutable.LinkedHashSet.

  • @ozone有趣的问题.也许最简单的方法是创建一个类型为`Map [String,File]`的新[map](http://www.scala-lang.org/api/current/index.html#scala.collection.Map),其中键是感兴趣的文件名的一部分.一旦构造了映射,就可以调用`values`方法来获得一个`Iterable`值 - 键将通过构造完全不同. (4认同)
  • 如果你有一个文件列表并且需要比较文件名的一部分怎么办? (2认同)

cro*_*ies 17

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

所以dirty.distinct现在可以调用而无需转换为SetSeq.


par*_*tic 15

在使用Kitpon的解决方案之前,考虑使用Set而不是a List,它确保每个元素都是唯一的.

由于大部分列表操作(foreach,map,filter,...)是集合和列表相同,改变收集可能是代码非常容易.


小智 7

当然,首先使用Set是正确的方法,但是:

scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)
Run Code Online (Sandbox Code Playgroud)

作品.或者就像toSet它支持SEQ Traversable 接口.