2011-11-28 14 views
6

में पदों की एक सूची दी विभाजित करने के लिए कैसे कैसे आप split(positions:List[Int], str:String):List[String] के लिए एक funcitonal कार्यान्वयन, जो splitAt के समान है लेकिन पदों की एक दी गई सूची में से तार का एक सूची में एक दिया स्ट्रिंग विभाजन लिखते थे ?एक स्ट्रिंग स्काला

उदाहरण के लिए

  • split(List(1, 2), "abc") रिटर्न List("a", "b", "c")
  • split(List(1), "abc") रिटर्न List("a", "bc")
  • split(List(), "abc") रिटर्न List("abc") इस तरह
+1

मैं 'सबस्ट्रिंग के आधार पर एक समाधान का उपयोग करेंगे 'splitAt' के बजाय'। पूर्व मूल में 'स्ट्रिंग' मूल का पुन: उपयोग करेगा, जबकि बाद वाले तार तारों को नए तारों में कॉपी करेंगे। प्रदत्त समाधानों को 'substring' का उपयोग करने के लिए अनुकूलित किया जा सकता है। –

उत्तर

4
def lsplit(pos: List[Int], str: String): List[String] = { 
    val (rest, result) = pos.foldRight((str, List[String]())) { 
    case (curr, (s, res)) => 
     val (rest, split) = s.splitAt(curr) 
     (rest, split :: res) 
    } 
    rest :: result 
} 
4

कुछ:

def lsplit(pos: List[Int], s: String): List[String] = pos match { 
    case x :: rest => s.substring(0,x) :: lsplit(rest.map(_ - x), s.substring(x)) 
    case Nil => List(s) 
} 

(उचित चेतावनी: पूंछ रिकर्सिव नहीं तो बड़ी सूचियों के लिए ढेर को उड़ा देगा; सूचकांक और सबस्ट्रिंग की श्रृंखला की बार-बार रीमेपिंग के कारण कुशल नहीं है। आप अतिरिक्त तर्क और/या एक आंतरिक विधि है कि प्रत्यावर्तन करता जोड़कर इन बातों को हल कर सकते हैं।)

+0

धन्यवाद। मैं आपके समाधान का पूंछ रिकर्सिव संस्करण बनाना चाहता हूं। – Michael

+2

@ माइकल - शायद 'स्टार्टएट' इंडेक्स जोड़ने पर विचार करना चाहें ताकि आप 's.substring (startAt, x) :: lsplit (rest, s, startAt + x)' (गैर-पूंछ-रिकर्सिव संस्करण में, बेशक)। यदि आप करते हैं, तो 'शून्य' मामले को न भूलें। –

2

कैसे के बारे में ....

def lSplit(indices : List[Int], s : String) = (indices zip (indices.tail)) map { case (a,b) => s.substring(a,b) } 

scala> lSplit(List(0,4,6,8), "20131103") 
List[String] = List(2013, 11, 03)