2012-08-27 10 views
90

मैं एक अनुक्रम द्वारा एक अनुक्रम को दो सूचियों में कैसे विभाजित करूं?अनुमान के अनुसार एक अनुक्रम को दो टुकड़ों में कैसे विभाजित करें?

वैकल्पिक: मैं filter और filterNot का उपयोग कर सकता हूं, या अपनी खुद की विधि लिख सकता हूं, लेकिन क्या कोई बेहतर सामान्य (अंतर्निहित) विधि नहीं है?

उत्तर

144

partition पद्धति का उपयोग करके द्वारा:

scala> List(1,2,3,4).partition(x => x % 2 == 0) 
res0: (List[Int], List[Int]) = (List(2, 4),List(1, 3)) 
13

आप scalex.org पर एक नज़र डालें करना चाह सकते हैं - यह आप उनके हस्ताक्षर द्वारा कार्यों के लिए स्केला मानक पुस्तकालय खोज करने के लिए अनुमति देता है। उदाहरण के लिए, निम्न लिखें:

List[A] => (A => Boolean) => (List[A], List[A]) 

आप विभाजन देखना होगा।

+7

scalex.org डोमेन वर्तमान में मर चुका है। लेकिन वैकल्पिक है - http://scala-search.org/ ;-)। – monnef

118

अच्छा partition वह चीज था जो आप चाहते थे - एक और तरीका है जो दो: span में एक सूची को विभाजित करने के लिए भविष्यवाणी का उपयोग करता है।

पहला, partition सभी "सत्य" तत्वों को एक सूची में और दूसरी सूची में अन्य लोगों को रखेगा।

span सभी तत्वों को एक सूची में तब तक रखा जाएगा जब तक कोई तत्व "झूठा" (भविष्यवाणी के संदर्भ में) न हो। उस बिंदु से आगे, यह तत्वों को दूसरी सूची में रखेगा।

scala> Seq(1,2,3,4).span(x => x % 2 == 0) 
res0: (Seq[Int], Seq[Int]) = (List(),List(1, 2, 3, 4)) 
+2

बिल्कुल वही जो मैं खोज रहा था। जब सूची को संबंधित मानदंड द्वारा आदेश दिया जाता है, तो यह बहुत अधिक समझ में आता है। – erich2k8

11

तुम भी foldLeft उपयोग कर सकते हैं अगर आप कुछ थोड़ा अतिरिक्त जरूरत है। मैं तो बस इस तरह की कुछ कोड लिखा था जब विभाजन इसे काट नहीं था:

val list:List[Person] = /* get your list */ 
val (students,teachers) = 
    list.foldLeft(List.empty[Student],List.empty[Teacher]) { 
    case ((acc1, acc2), p) => p match { 
     case s:Student => (s :: acc1, acc2) 
     case t:Teacher => (acc1, t :: acc2) 
    } 
    } 
+1

टुपल और फ़ोल्ड लेफ्ट का उपयोग करने का बहुत अच्छा तरीका। मैं एक सूची में दो सूचियों को कुशलता से रखने के लिए एक सूचीबफर का उपयोग कर समाप्त हुआ लेकिन अन्यथा यह आवश्यक था कि मुझे क्या चाहिए। –

0

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

def split(list_in: List[String], search: String): List[List[String]] = { 
    def split_helper(accum: List[List[String]], list_in2: List[String], search: String): List[List[String]] = { 
    val (h1, h2) = list_in2.span({x: String => x!= search}) 
    val new_accum = accum :+ h1 
    if (h2.contains(search)) { 
     return split_helper(new_accum, h2.drop(1), search) 
    } 
    else { 
    return accum 
    } 
    } 
    return split_helper(List(), list_in, search) 
} 

// TEST 

// split(List("a", "b", "c", "d", "c", "a"), {x: String => x != "x"}) 
संबंधित मुद्दे

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