如何有效地计算集合中的不同字段?

How do I efficiently count distinct fields in a collection?

我目前正在这样做:

val count = sightings.map(_.shape).distinct.length

但是,map 创建了一个中间集合,在我的例子中,它是一个比 distinct 生成的向量大数千倍的 Vector。

如何绕过这个中间步骤并获得一组不同的形状?或者,更好的是,不同形状的数量。

一种方法是删除重复项,然后计算结果。

sightings.foldLeft(Set[Shape]()){case (ss,sight) => ss + sight.shape}.size

形状的中间 Set 仅与迄今为止遇到的所有不同形状一样大。

您可以使用迭代器不创建中间集合,然后在 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

除了其他答案之外,还有一个确切的解决方案可以解决您的问题。

Breakout是您要查找的密钥。

用法示例:

 import scala.collection.breakOut
 val count = sightings.map(_.shape)(breakOut).distinct.length

此处,使用 breakOut 可防止创建中间集合。

您可以阅读 documentation 了解更多信息。