加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 元组从列表中重复删除

发布时间:2020-12-16 09:06:58 所属栏目:安全 来源:网络整理
导读:考虑以下元组列表: val input= List((A,B),(C,(B,A)) 并且假设元素(A,B)和(B,A)是相同的并且因此是重复的,从上面的列表中消除重复的有效方式(优选地在Scala中)是什么.这意味着所需的输出是另一个列表: val deduplicated= List((A,B)) 提前致谢! p.s:这不
考虑以下元组列表:

val input= List((A,B),(C,(B,A))

并且假设元素(A,B)和(B,A)是相同的并且因此是重复的,从上面的列表中消除重复的有效方式(优选地在Scala中)是什么.这意味着所需的输出是另一个列表:

val deduplicated= List((A,B))

提前致谢!

p.s:这不是家庭作业;)

更新:

谢谢大家! “集合”解决方案似乎是最好的解决方案.

解决方法

您可以使用set来尝试它,但是您需要声明自己的元组类以使其工作.

case class MyTuple[A](t: (A,A)) {
  override def hashCode = t._1.hashCode + t._2.hashCode
  override def equals(other: Any) = other match {
    case MyTuple((a,b)) => a.equals(t._1) && b.equals(t._2) || a.equals(t._2) && b.equals(t._1)
    case _ => false
  }
}

val input= List(("A","B"),("C",("B","A"))

val output = input.map(MyTuple.apply).toSet.toList.map((mt: MyTuple[String]) => mt.t)
println(output)

编辑:
特拉维斯的回答让我意识到有一个更好的方法来做到这一点.这是通过编写一个与sortBy类似的distinctBy方法.

implicit class extList[T](list: List[T]) {
  def distinctBy[U](f: T => U): List[T] = {
    var set = Set.empty[U]
    var result = List.empty[T]
    for(t <- list) {
      val u = f(t)
      if(!set(u)) {
        result ::= t
        set += u
      }
    }
    result.reverse
  }
}

println(input.distinctBy { case (a,b) => Set((a,b),(b,a)) })

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读