2013-01-21 12 views
18

Gibt es eine Möglichkeit, dies effizient zu tun, vielleicht durch toBuffer oder Methoden? Mein wirkliches Problem ist, ich baue eine Liste aus einem Parser, wie folgt:Wie konvertiert man List zu ListBuffer?

lazy val nodes: Parser[List[Node]] = phrase((nodeA | nodeB | nodeC).*) 

Aber nachdem er dem Aufbau, ich will es stattdessen um einen Puffer zu sein - ich bin nur nicht sicher, wie ein Puffer gerade bauen aus dem Parser.

+0

Befürchten Sie, dass 'toBuffer' nicht ausreichend performant ist? – cheeken

+0

Wenn ich richtig verstehe, will er einen 'ListBuffer', nicht irgendeinen' Puffer', der von 'toBuffer' zurückgegeben wird. –

+0

Ja, ich brauche einen ListBuffer. Leistung ist einfach ein Problem, weil ich gerne wissen möchte, was die Kosten der Konvertierung sind (ich nehme an, linear), aber da dies nur Teil eines Initialisierungsschritts ist, könnte das akzeptabel sein. – Dan

Antwort

37

to tatsächlich funktioniert der Trick, und es ist ziemlich trivial zu verwenden:

scala> val l = List(1,2,3) 
l: List[Int] = List(1, 2, 3) 
scala> l.to[ListBuffer] 
res1: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3) 

Arbeiten in scala 2.10.x

Für scala 2.9.x können Sie tun:

scala> ListBuffer.empty ++= l 
res1: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3) 
+0

Nizza; +1! Gerade als ich dachte, die Collection-API könnte nicht magischer sein (aus der Perspektive von 2.8) ... – cheeken

+0

'++ =' wird den gleichen 'ListBuffer' wiederverwenden anstatt einen leeren zu erstellen und ihn dann wieder wegzuwerfen . (Nicht das Erstellen eines leeren 'ListBuffer' ist besonders teuer.) –

+0

Guter Punkt, ich werde die Antwort aktualisieren. –