2014-01-10 45 views
1

我有一个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所有序列对象的ListBuffer

我试了++运营商,通过直接添加matcheslis。它也没有工作。我用Scala的2.10.2

回答

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,就像你可以

+0

其实'appendAll' [无异于'不同++ ='](https://github.com/scala/scala/blob/v2。 10.3/src/library/scala/collection/mutable/BufferLike.scala#L147) –

+0

是的,你是对的。只是不要混淆“Balaram26” – serejja

0

你并不需要附加一个空ListBuffer,只需直接创建它:

import collection.breakOut 

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

breakOut是这里的魔力。在Seq[Seq[T]]上调用flatten通常会创建一个Seq[T],然后您必须将其转换为ListBuffer。使用breakOut会导致它查看预期的输出类型并改为创建该类集合。

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

val matches = lis.flatten 
相关问题