Scala中如何通过单次迭代优化元组序列的双非零子序列生成?
单次迭代实现方案
可以用foldLeft在一次遍历中同时构建两个目标序列,彻底避免重复遍历源数据:
val subjectpairs = IndexedSeq((8,0),(3,4),(0,9),(6,1)) val (priors, posts) = subjectpairs.foldLeft((IndexedSeq.empty[Int], IndexedSeq.empty[Int])) { case ((pAcc, pstAcc), (f, l)) => val newPAcc = if (f > 0) pAcc :+ f else pAcc val newPstAcc = if (l > 0) pstAcc :+ l else pstAcc (newPAcc, newPstAcc) }
这段代码初始化两个空的IndexedSeq作为累积容器,遍历每个元组时分别检查首尾元素是否非零,更新对应容器,最终一次性得到两个结果序列,全程仅遍历源序列一次。
额外优化建议
用可变集合提升累积效率:如果源数据量极大,不可变
IndexedSeq的:+尾追加操作会频繁生成新副本,效率偏低。可以改用ArrayBuffer作为临时累积容器,最后再转成目标类型:import scala.collection.mutable.ArrayBuffer val (priorsBuf, postsBuf) = subjectpairs.foldLeft((ArrayBuffer.empty[Int], ArrayBuffer.empty[Int])) { case ((pAcc, pstAcc), (f, l)) => if (f > 0) pAcc += f if (l > 0) pstAcc += l (pAcc, pstAcc) } val priors = priorsBuf.toIndexedSeq val posts = postsBuf.toIndexedSeq简化过滤条件:从示例数据看元素都是整数,没必要用
>0.0的浮点比较,直接用>0即可,减少不必要的类型转换开销。谨慎尝试并行遍历:如果源序列支持并行化(比如
ParIndexedSeq),在多核环境下可尝试并行处理,但要注意并行操作的额外开销,仅当数据量极大时才值得考虑:val (priors, posts) = subjectpairs.par.foldLeft((ArrayBuffer.empty[Int], ArrayBuffer.empty[Int])) { case ((pAcc, pstAcc), (f, l)) => if (f > 0) pAcc += f if (l > 0) pstAcc += l (pAcc, pstAcc) } match { case (p, ps) => (p.toIndexedSeq, ps.toIndexedSeq) }
内容的提问来源于stack exchange,提问作者IUnknown
相关产品推荐
相关产品推荐

