【问题标题】:Remove unique items from sequence [duplicate]从序列中删除唯一项目[重复]
【发布时间】:2014-08-19 04:07:02
【问题描述】:

我找到了很多关于如何删除重复项的信息,但最优雅的方法是先删除唯一项,然后再删除剩余的重复项。

例如序列 (1, 2, 5, 2, 3, 4, 4, 0, 2) 应转换为 (2, 4)。

我可以考虑使用 for 循环为每个不同的项目添加计数,但我可以想象 Scala 有一种更优雅的方式来实现这一点。

【问题讨论】:

  • 查看this SO 帖子。
  • 谢谢,但是我不能让它工作。我有一个 Seq[String] = ArrayBuffer(..),但在尝试使用您的答案中提供的函数时不断收到error: type mismatch; found : scala.collection.immutable.Iterable[String] required: Seq[String]
  • 如果您的问题有特定的限制或更详细的内容,您应该将您拥有的代码添加到您的问题中,因为您的问题与我链接到您的问题重复,请编辑您的问题。
  • 我不知道。这是近一个月内第三次被问到这个问题。而且我们总是转发相同的重复答案。
  • 显然我使用了错误的术语来搜索解决方案。您可以看到我的标题与链接的解决方案有何不同。

标签: scala


【解决方案1】:

distinctdiff 适合您:

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

【讨论】:

  • distinct 保留顺序,而 toSet 不保留。
【解决方案2】:

还请记住,i => i 可以替换为 identitymap(_._1) 替换为 keys,如下所示:

Seq(1, 2, 5, 2, 3, 4, 4, 0, 2).groupBy(identity).filter(_._2.size > 1).keys.toSeq

这就是 countByKey 方法(例如可以在 Spark 的 API 中找到的方法)有用的地方。

【讨论】:

  • 虽然 Mariusz Nosiński 的回答是(对我而言)解决这个问题的最直观的方法,但我对此给出了公认的答案,因为它可以轻松更改所需出现的次数。
【解决方案3】:

非常简单:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多