给定Scala中的案例类列表,什么是通过字段子集对列表进行重复数据删除的最佳方法

时间:2019-06-10 21:17:48

标签: scala functional-programming

如果我有要删除重复项的案例类列表,但只关心某些字段的唯一性,那么最好的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
}

0 个答案:

没有答案