2011-09-03 20 views
11

संतोषजनक मैं रूप में डेटा है एक पाठ फ़ाइल में एक सूची विभाजितप्रत्येक तत्व एक विधेय (स्काला)

val input = io.Source.fromFile("filename.txt").getLines().toList 

मैं 1) के साथ शुरू उप सूचियों में डाउन सूची को तोड़ने के लिए चाहते हैं, 2) आदि

मैं ले कर आए हैं:

val subLists = 
    input.foldRight(List(List[String]())) { 
    (x, acc) => 
     if (x.matches("""[0-9]+\)""")) List() :: (x :: acc.head) :: acc.tail 
     else (x :: acc.head) :: acc.tail 
    }.tail 

क्या यह अधिक आसानी से प्राप्त किया जा सकता है? क्या वास्तव में अच्छा होगा यदि प्रत्येक तत्व पर एक संग्रह को विभाजित करने के लिए एक अंतर्निहित विधि थी जो एक अनुमान (संकेत, संकेत, पुस्तकालय डिजाइनर :)) को संतुष्ट करता है।

+1

इस सवाल पर एक नज़र और स्वीकार किए जाते हैं जवाब ले लो द्वारा बस परिणाम मिलता है। कॉम/प्रश्न/6800737/कैसे-टू-ग्रुप-ए-वेरिएबल-लम्बाई-दोहराने-अनुक्रम-इन-स्कैला – mpilquist

+0

इस जवाब में इटरेटर का उपयोग करना संभव है, लेकिन यह मामला अधिक जटिल है क्योंकि प्रत्येक शीर्षक अलग है, इसलिए आप ' डी शीर्षक के लिए एक दूसरी Iterator/सूची की जरूरत है, और यह सुरुचिपूर्ण होने बंद हो जाता है। रिकर्सन बहुत साफ दिखता है। –

उत्तर

24

foldRight एक जटिल तर्क के साथ आम तौर पर एक संकेत है कि आप इसे रिकर्सन का उपयोग करके भी लिख सकते हैं, और इसे अपने तरीके से कारक बना सकते हैं, जबकि आप इसमें हैं। यहां मैं क्या आया था। सबसे पहले, के एक सामान्य विधि के लिए सामान्यीकरण जाने groupPrefix: http: // stackoverflow

/** Returns shortest possible list of lists xss such that 
    * - xss.flatten == xs 
    * - No sublist in xss contains an element matching p in its tail 
    */ 
def groupPrefix[T](xs: List[T])(p: T => Boolean): List[List[T]] = xs match { 
    case List() => List() 
    case x :: xs1 => 
    val (ys, zs) = xs1 span (!p(_)) 
    (x :: ys) :: groupPrefix(zs)(p) 
} 

अब आप बुला

groupPrefix(input)(_ matches """\d+\)""") 
+1

एक समस्या: यह बड़ी संख्या में समूहों (स्टैक ओवरफ्लो) के लिए काम नहीं करेगा –

+0

सूची जिसमें 10000 डिलीमीटर के साथ 476 के तत्व शामिल हैं, स्टैक को उड़ाते हैं –

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