2010-12-11 5 views
15

मेरे पास एक सूची बफर है। मैं एक निश्चित स्थिति को पूरा करने वाले सभी तत्वों को हटाना चाहता हूं।स्कैला एक सूची बफर के सभी तत्वों को हटाएं (जगह में)

मैं इसे फिर से सक्रिय कर सकता हूं और प्रत्येक तत्व को हटा सकता हूं। लेकिन स्काला एक सूची को म्यूट करने के बारे में क्या कहता है जिसे आप कर रहे हैं? क्या यह काम करेगा, या क्या यह गलत तत्वों को हटा देगा/सभी तत्वों को वापस नहीं करेगा? (आरईपीएल के साथ एक त्वरित प्रयास से पता चलता है कि हाँ, यह गड़बड़ हो जाएगा)

मैं बार-बार कॉल कर सकता हूं और फिर पाया गया तत्व हटा सकता हूं जब तक कि मुझे और नहीं मिलता, लेकिन यह अक्षम होता है।

। फ़िल्टर मुझे तत्वों के बिना एक नया ListBuffer वापस कर देगा, लेकिन मैं इसे जगह में करना चाहता हूं।

यह

def --= (xs: TraversableOnce[A]) : ListBuffer.this.type 
Removes all elements produced by an iterator from this list buffer. 

होनहार लग रहा है लेकिन मैं काफी यह यहां कैसे उपयोग करने के लिए

मैं इस करना चाहिए नहीं देख सकते हैं?

+0

यह भी देखें http://stackoverflow.com/questions/2803085/iterators-for-mutable-collections-in-scala –

उत्तर

5

आप इस कुशलता से ऐसा नहीं कर सकते, दुर्भाग्य से। --=(xs: TraversableOnce[A]) के कार्यान्वयन (विस्तारित रूप में, वास्तविक कोड अधिक कॉम्पैक्ट है)

xs foreach (x => this -= x) ; this 

जो बस के रूप में (यानी O(n*m) जहां n मूल सूची की लंबाई है यह है और एक समय में यह एक कर के रूप में अक्षम है m निकालने के लिए आइटम की संख्या है)।

सामान्य रूप से, उत्परिवर्तनीय संग्रह में अपरिवर्तनीय लोगों के रूप में विधियों का एक सेट पूर्ण और शक्तिशाली नहीं होता है।

तो (यह, वे सब अद्भुत अपरिवर्तनीय संग्रह पर इस्तेमाल किया तरीकों, लेकिन उनकी खुद की अपेक्षाकृत कुछ है।) जब तक आप बहुत कुछ तत्वों को हटा रहे हैं, तो आप शायद बंद बनाने के लिए सूची को फ़िल्टर बेहतर कर रहे हैं एक नया।

+3

"उत्परिवर्तनीय संग्रह में अपरिवर्तनीय लोगों के रूप में विधियों का एक सेट पूर्ण और शक्तिशाली नहीं है।" हाँ। यह दुख की बात है। कार्यात्मक प्रोग्रामिंग बहुत अच्छा हो सकता है, लेकिन कभी-कभी एक म्यूटेबल डेटा स्ट्रक्चर वास्तव में मैं चाहता हूं और बहु-केवल ओप के लिए अपेक्षाकृत कम समर्थन थोड़ा निराशाजनक है –

6

आप दो गठबंधन और निम्न कर सकता है:

val lb = ListBuffer(1,2,3,4,5,6) 
lb --= lb.filter(_ % 2 == 0) 

println(lb) 
// outputs: ListBuffer(1, 3, 5) 
+0

बिल्कुल सही। शायद गूंगा होना, लेकिन यह कैसे काम करता है? फ़िल्टर एक सूची के बजाय एक पुनरावर्तक वापस करता है? या TraversableOnce का मतलब है कि एक सूची एक iterator के रूप में पर्याप्त है - =? –

+0

'ट्रैवर्सबलऑन' एक पुनरावर्तक से अधिक सामान्य है। यह 'ट्रैवर्सबल' (जिस पर सभी संग्रह आधारित हैं) और 'इटरेटर' दोनों का एक सामान्य सुपरक्लास है। –

+0

देखें http://www.scala-lang.org/docu/files/collections-api/collections.html –

संबंधित मुद्दे