我发现了很多关于如何删除重复项的内容,但是首先删除唯一项目然后删除剩余重复项的最优雅方法是什么。
E.g。序列(1,2,5,2,3,4,4,0,2)应转换为(2,4)。
我可以考虑使用for循环为每个不同的项添加计数,但我可以想象Scala有更优雅的方法来实现这一点。
答案 0 :(得分:2)
distinct
和diff
适合您:
val a = List(1, 2, 5, 2, 3, 4, 4, 0, 2)
> a: List[Int] = List(1, 2, 5, 2, 3, 4, 4, 0, 2)
val b = a diff a.distinct
> b: List[Int] = List(2, 4, 2)
val c = (a diff a.distinct).distinct
> c: List[Int] = List(2, 4)
到位distinct
您也可以使用toSet
。
答案 1 :(得分:1)
另请注意,i => i
可以由identity
和map(_._1)
替换为keys
,如下所示:
Seq(1, 2, 5, 2, 3, 4, 4, 0, 2).groupBy(identity).filter(_._2.size > 1).keys.toSeq
这是countByKey
方法(例如可以在Spark的API中找到的方法)的用法。
答案 2 :(得分:0)
非常直接:
Seq(1, 2, 5, 2, 3, 4, 4, 0, 2).groupBy(i => i).filter(_._2.size > 1).map(_._1).toSeq
使用Ende Neu的链接我认为你的代码会变成这样:
Seq(1, 2, 5, 2, 3, 4, 4, 0, 2).groupBy(identity).collect { case (v, l) if l.length > 1 => v } toSeq