如何有效地计算集合中的不同字段?
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 了解更多信息。
我目前正在这样做:
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 了解更多信息。