检查 Scala Set 中所有 'Seq' 元素的大小是否为 1 的最快方法是什么?
What is the fastest way to check whether all 'Seq' elements are of size 1 in a Scala Set?
这就是我现在正在做的事情:
val foo = Set[Seq[Int]](Seq(1), Seq(2), Seq(3))
val isAllSizeOne = foo.foldLeft(true) { case (agg, curr) => agg && curr.size == 1}
我能比这更快吗?
方法 forall
旨在完全满足您的要求。
foo.forall(_.size == 1)
在大多数情况下,这将是您能找到的最快的实施方式。一如既往,如果它非常重要,您应该尝试对备选方案进行基准测试 and/or,并注意哪个最快可能取决于您使用的是哪个集合。
最简洁的版本:
val isAllSizeOne = foo.forall(_.size == 1)
另一个 可能 更快但不够简洁的替代方案:
val isAllSizeOne = foo.forall(_.lengthCompare(1) == 0)
对于非常大的集合,也值得考虑使用 par
的并行版本,例如这样,
foo.par.forall(_.size == 1)
大小操作需要依次遍历所有元素,另一种可能是:
foo.forall(l => l.nonEmpty && l.tail.isEmpty)
虽然考虑到Sequence的大小很小,但差别不大。
这就是我现在正在做的事情:
val foo = Set[Seq[Int]](Seq(1), Seq(2), Seq(3))
val isAllSizeOne = foo.foldLeft(true) { case (agg, curr) => agg && curr.size == 1}
我能比这更快吗?
方法 forall
旨在完全满足您的要求。
foo.forall(_.size == 1)
在大多数情况下,这将是您能找到的最快的实施方式。一如既往,如果它非常重要,您应该尝试对备选方案进行基准测试 and/or,并注意哪个最快可能取决于您使用的是哪个集合。
最简洁的版本:
val isAllSizeOne = foo.forall(_.size == 1)
另一个 可能 更快但不够简洁的替代方案:
val isAllSizeOne = foo.forall(_.lengthCompare(1) == 0)
对于非常大的集合,也值得考虑使用 par
的并行版本,例如这样,
foo.par.forall(_.size == 1)
大小操作需要依次遍历所有元素,另一种可能是:
foo.forall(l => l.nonEmpty && l.tail.isEmpty)
虽然考虑到Sequence的大小很小,但差别不大。