द्वारा एक इटरटेबल Iterables में एक Iterable समूह I मेरे पास बहुत बड़े Iterators हैं जिन्हें मैं टुकड़ों में विभाजित करना चाहता हूं। मेरे पास एक अनुमान है जो एक आइटम को देखता है और यदि यह एक नए टुकड़े की शुरुआत है तो सच हो जाता है। मुझे टुकड़े टुकड़े करने की जरूरत है, क्योंकि टुकड़े भी स्मृति में फिट नहीं होंगे। इतने सारे टुकड़े हैं कि मैं आपके स्टैक को उड़ाते हुए एक पुनरावर्ती समाधान से सावधान रहूंगा। स्थिति this question के समान है, लेकिन मुझे सूची के बजाय इटरेटर की आवश्यकता है, और "सेंटीनेल" (जिन वस्तुओं के लिए भविष्य सत्य है) एक टुकड़े की शुरुआत में होते हैं (और शामिल किए जाने चाहिए)। परिणामी इटरेटर्स का उपयोग केवल क्रम में किया जाएगा, हालांकि कुछ का उपयोग नहीं किया जा सकता है, और उन्हें केवल ओ (1) मेमोरी का उपयोग करना चाहिए। मुझे कल्पना है कि इसका मतलब है कि उन्हें सभी एक ही अंतर्निहित पुनरावर्तक साझा करना चाहिए। प्रदर्शन महत्वपूर्ण है।स्कैला:
अगर मैं एक समारोह हस्ताक्षर पर एक वार तय लग रही थी, यह इस होगा:
def groupby[T](iter: Iterator[T])(startsGroup: T => Boolean): Iterator[Iterator[T]] = ...
मैं takeWhile
उपयोग करने के लिए प्यार किया है होगा, लेकिन यह पिछले तत्व खो देता है। मैंने span
की जांच की, लेकिन यह परिणाम बफर करता है। मेरे वर्तमान सर्वोत्तम विचार में BufferedIterator
शामिल है, लेकिन शायद एक बेहतर तरीका है।
आपको पता चल जाएगा कि आप इसे मिल गया है सही है क्योंकि कुछ इस तरह अपने JVM दुर्घटना नहीं करता है:
groupby((1 to Int.MaxValue).iterator)(_ % (Int.MaxValue/2) == 0).foreach(group => println(group.sum))
groupby((1 to Int.MaxValue).iterator)(_ % 10 == 0).foreach(group => println(group.sum))
देखें http://stackoverflow.com/questions/5410846/how-do-i-apply-the-pimp-my-library-pattern-to-scala-collections/5411133#5411133 – huynhjl