我有一个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
?
我尝试了++
运算符,直接添加了matches
和lis
。它也没用。我使用Scala 2.10.2
答案 0 :(得分:2)
试试这个:
matches.appendAll(lis.flatten)
这样你可以完全避免变异ListBuffer
。 lis.flatten
将是Seq[(String, Int)]
。所以你可以这样缩短你的代码:
val lis = ... //whatever that is Seq[Seq[(String, Int)]]
val flatLis = lis.flatten // Seq[(String, Int)]
尽可能地避免使用var
和ListBuffer
等可变结构
答案 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