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
答案 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))