2013-01-21 28 views
18

क्या यह कुशलता से ऐसा करने का कोई तरीका है, शायद बफर या विधियों के माध्यम से? मेरे वास्तविक समस्या मैं एक पार्सर बंद एक सूची बनाने जा रहा है कर रहा हूँ इस प्रकार है:सूची सूची में सूची कैसे परिवर्तित करें?

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

लेकिन यह निर्माण के बाद, मैं इसे एक बफर के बजाय होना चाहता हूँ - मैं सिर्फ यकीन है कि एक बफर सीधे निर्माण करने के लिए कैसे नहीं कर रहा हूँ पार्सर से।

+0

क्या आपकी चिंता है कि 'toBuffer' पर्याप्त रूप से प्रदर्शन नहीं कर रहा है? – cheeken

+0

यदि मैं सही ढंग से समझता हूं, तो वह 'लिस्टबफर' चाहता है, न कि 'बफर' के रूप में 'toBuffer' –

+0

द्वारा लौटाए गए, हाँ, मुझे एक सूचीबफर की आवश्यकता है। प्रदर्शन केवल एक चिंता है क्योंकि मैं जानना चाहता हूं कि रूपांतरण की लागत क्या है (मैं रैखिक मानता हूं), लेकिन चूंकि यह प्रारंभिक चरण का हिस्सा है, यह स्वीकार्य हो सकता है। – Dan

उत्तर

37

to वास्तव में काम कर देता है, और इसका इस्तेमाल करने के लिए बहुत मामूली बात है:

स्केला 2.10.x

स्केला 2.9.x के लिए में

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) 

काम करता है, आप कर सकते हैं:

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

अच्छा; +1! बस जब मैं सोच रहा था कि संग्रह एपीआई और जादुई नहीं हो सकता है (2.8 के परिप्रेक्ष्य से) ... – cheeken

+0

'++ =' एक खाली बनाने के बजाय वही 'ListBuffer' का पुन: उपयोग करेगा और फिर इसे फिर से फेंक देगा । (यह नहीं कि एक खाली 'ListBuffer' बनाना विशेष रूप से महंगा है।) –

+0

अच्छा बिंदु, मैं जवाब अपडेट करूंगा। –