scala - 如何使 scala 集合包含唯一元素? ("unique"定义)

标签 scala scala-collections

假设我有一个列表如下:

val l = List( (1, 2, "hi"), (1, 3, "hello"), (2, 3, "world"), (1, 2, "hello") )

我想让 l 的元素不同,忽略元组的第三个元素。也就是说,如果 l 的前两个元素相同,则它们被视为相同。

所以 makeDistinct(l) 应该返回

List( (1, 2, "hi"), (1, 3, "hello"), (2, 3, "world") )

实现 makeDistinct 的最像 Scala 和通用的方法是什么

编辑:我们可以自由选择删除哪个,并且不需要保留顺序。

最佳答案

如果您想对列表执行此操作,请使用groupBy:

l.groupBy(x => (x._1, x._2)).map(kv => kv._2.head).toList

如果您确实想对所有集合类型通用:

scala> import scala.collection.generic.CanBuildFrom
import scala.collection.generic.CanBuildFrom

scala> def distinct[A, B, C, CC[X] <: Traversable[X]](xs: CC[(A, B, C)])(implicit cbf: CanBuildFrom[Nothing, (A, B, C), CC[(A, B, C)]]): CC[(A, B, C)] = xs.groupBy(x => (x._1, x._2)).map(kv => kv._2.head).to[CC]
warning: there were 1 feature warnings; re-run with -feature for details
distinct: [A, B, C, CC[X] <: Traversable[X]](xs: CC[(A, B, C)])(implicit cbf: scala.collection.generic.CanBuildFrom[Nothing,(A, B, C),CC[(A, B, C)]])CC[(A, B, C)]

scala> distinct(List((1, 2, "ok"), (1, 3, "ee"), (1, 2, "notok")))
res0: List[(Int, Int, String)] = List((1,3,ee), (1,2,ok))

关于scala - 如何使 scala 集合包含唯一元素? ("unique"定义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16083233/

相关文章:

scala - 为什么 Scala 有路径依赖类型?

scala - Scala 中的非严格、不可变、非记忆化的无限系列

scala - Scala 中的多个 flatMap

arrays - Scala:将 csv 字符串转换为数组

scala - Scala 中的树集合

scala - ReactiveMongo 是如何实现的,因此它被认为是非阻塞的?

json - 使用 Jackson 在 Scala 中将 List[Any] 序列化到/从 Json

scala - 这是一种在 Akka FSM 中内部监视到第一个状态的转换的方法吗?

scala - 如何在 Scala 2.8 中实现集合?

scala - Scala 中的平等关系