在Scala集中检查所有'Seq'元素是否大小为1的最快方法是什么?

时间:2015-01-05 10:44:48

标签: scala

这就是我现在正在做的事情:

val foo = Set[Seq[Int]](Seq(1), Seq(2), Seq(3))
val isAllSizeOne = foo.foldLeft(true) { case (agg, curr) => agg && curr.size == 1}

我可以比这更快吗?

4 个答案:

答案 0 :(得分:9)

方法forall旨在完全按照您的要求进行。

foo.forall(_.size == 1)

在大多数情况下,它是您能找到的最快的实施方案。与往常一样,如果它非常重要,您应该尝试对备选方案进行基准测试和/或分析,并注意哪个最快可能取决于您正在使用哪个集合。

答案 1 :(得分:9)

最简洁的版本:

val isAllSizeOne = foo.forall(_.size == 1)

另一种替代方案可能更快但不简洁:

val isAllSizeOne = foo.forall(_.lengthCompare(1) == 0)

答案 2 :(得分:4)

对于非常大的集合,值得考虑使用par的并行版本,例如像这样,

foo.par.forall(_.size == 1)

答案 3 :(得分:1)

大小操作需要按顺序遍历所有元素,另一种选择可能是:

foo.forall(l => l.nonEmpty && l.tail.isEmpty)

虽然考虑到序列的大小很小,但它没有太大的区别。