如果我有要删除重复项的案例类列表,但只关心某些字段的唯一性,那么最好的Scala / FP方法是什么?
case class Dog(name: String, breed: String, weight: Int, age: Int)
例如,如果我有List[Dog]
并且只想按名称进行重复数据删除并繁殖,那么上述案例类是否有惯用的方法?
下面的方法有效,但是我想避免HashSet的可变状态。
import scala.collection.mutable
object Dog {
def dedupe(list: Traversable[Dog])
: List[Dog] =
list
.foldLeft(
(List[Dog](),
mutable.HashSet[(String, String)]())) {
case ((list, hash), dog)
if hash.add((dog.name, dog.breed)) =>
(dog :: list, hash)
case ((list, hash), _) =>
(list, hash)
}
._1
}
我也尝试过这种方法,但是不起作用:
object Dog {
def dedupe2(list: Traversable[Dog]): List[Dog] =
list.groupBy(dog => (dog.name, dog.breed)).values.flatten.toList
}