我目前正在这样做:
val count = sightings.map(_.shape).distinct.length
然而,map
创建了一个中间集合,在我的例子中,它是一个比distinct
产生的数千倍大的Vector。
如何绕过这个中间步骤并获得一组不同的形状?或者,更好的是,不同形状的数量。
答案 0 :(得分:4)
您可以使用迭代器来创建中间集合,然后在Set
中生成形状以获得不同的形状:
val count = sightings.iterator.map(_.shape).toSet.size
或者,您可以使用collection.breakOut
累积Set
中的项目而不创建中间集合(使用breakOut
建议的另一个答案,但以不同的方式):
val distinctShapes: Set[Shape] = sightings.map(_.shape)(collection.breakOut)
val count = distinctShapes.size
答案 1 :(得分:3)
一种方法是随时删除重复项,然后计算结果。
sightings.foldLeft(Set[Shape]()){case (ss,sight) => ss + sight.shape}.size
形状的中间Set
仅与目前遇到的所有不同形状一样大。
答案 2 :(得分:2)
除了其他答案之外,还有针对您的问题的确切解决方案。
Breakout
是您正在寻找的关键。
使用示例:
import scala.collection.breakOut
val count = sightings.map(_.shape)(breakOut).distinct.length
此处,使用breakOut
会阻止创建中间集合。
您可以阅读documentation了解详情。