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

时间:2017-10-01 06:52:09

标签: scala scala-collections

我目前正在这样做:

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

然而,map创建了一个中间集合,在我的例子中,它是一个比distinct产生的数千倍大的Vector。

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

3 个答案:

答案 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了解详情。