如何在列表中的case类字符串上运行不同?

时间:2018-12-17 16:37:07

标签: scala

scala> case class Color (name: String, shade: String)
defined class Color

scala> val colors = List[Color](Color("red", "light"), Color("green", "dark"), Color("red", "dark"))
colors: List[Color] = List(Color(red,light), Color(green,dark), Color(red,dark))

我需要找出是否有任何重复的阴影(即"dark"是上面列表中的重复项)

我该怎么做?我不能只运行colors.distinct,因为这将检查所有属性(name and shade)的区别,但是我只想查找shade

的重复项

3 个答案:

答案 0 :(得分:3)

如果您只想知道是否有重复项,我认为这可能是一种解决方案:

colors.map(_.shade).distinct

如果其长度小于colors的长度,则列表中有重复项。也就是说,如果:

colors.map(_.shade).distinct.size == colors.size

然后没有重复。

答案 1 :(得分:2)

一种可能的解决方案是先groupBy,然后再使用head

  case class Color (name: String, shade: String)
  val colors = List[Color](Color("red", "light"), Color("green", "dark"), Color("red", "dark"))
  println(colors.groupBy(_.shade).map(x => x._2.head).toList)

另一种方法是使用Scala reflect

  import scala.reflect.internal.util.Collections
  println(Collections.distinctBy(colors)(_.shade))

答案 2 :(得分:0)

让我们介绍一下新功能

def distinctBy[A, B](xs: List[A])(key: A => B): List[A] = {
  val seen = mutable.HashSet[B]()
  xs.filter { x =>
    val k = key(x)
    if (!seen(k)) {
      seen += k
      true
    } else false
  }
}

distinctBy(colors)(_.shade)

结果

res0: List[Color] = List(Color(red,light), Color(green,dark))