在循环中追加序列对象的最快方法

时间:2014-01-10 08:04:56

标签: scala scala-collections

我有一个for循环,在每次运行中我得到一个Seq[Seq[(String,Int)]]。我通常使用Seq[Seq[(String,Int)]]来获取每个Seq[(String,Int)],然后将其附加到ListBuffer[Seq[String,Int]]

以下是代码:

var lis; //Seq[Seq[Tuple2(String,Int)]]
var matches = new ListBuffer[(String,Int)]

someLoop.foreach(k=>
  // someLoop gives lis object on evry run,
  // and that needs to be added to matches list
  lis.foreach(j => matches.appendAll(j))  
)

有没有更好的方法来执行此过程而不通过Seq[Seq[String,Int]]循环,比如直接将Seq中的所有seq对象添加到ListBuffer

我尝试了++运算符,直接添加了matcheslis。它也没用。我使用Scala 2.10.2

2 个答案:

答案 0 :(得分:2)

试试这个:

matches.appendAll(lis.flatten)

这样你可以完全避免变异ListBufferlis.flatten将是Seq[(String, Int)]。所以你可以这样缩短你的代码:

val lis = ... //whatever that is Seq[Seq[(String, Int)]]
val flatLis = lis.flatten // Seq[(String, Int)]

尽可能地避免使用varListBuffer等可变结构

答案 1 :(得分:0)

您无需附加到空ListBuffer,只需直接创建它:

import collection.breakOut

val matches: ListBuffer[(String,Int)] =
  lis.flatten(breakOut)

breakOut在这里很神奇。在flatten上拨打Seq[Seq[T]]通常会创建Seq[T],然后您必须将其转换为ListBuffer。使用breakOut会使它查看预期的输出类型并改为构建那种集合。

当然......无论如何你只是使用ListBuffer进行可变性,所以Seq[T]可能正好你真正想要的。在这种情况下,只需让推理器做它的事情:

val matches = lis.flatten