2012-10-24 17 views
11

मैं एक सूची लिखना चाहता हूं जो एक सूची को फ़्लैट करता है।स्कैला फ़्लैटन सूची

object Flat { 
    def flatten[T](list: List[T]): List[T] = list match { 
    case Nil => Nil 
    case head :: Nil => List(head) 
    case head :: tail => (head match { 
     case l: List[T] => flatten(l) 
     case i => List(i) 
    }) ::: flatten(tail) 
    } 
} 

object Main { 
    def main(args: Array[String]) = { 
    println(Flat.flatten(List(List(1, 1), 2, List(3, List(5, 8))))) 
    } 
} 

मैं नहीं जानता कि क्यों यह काम नहीं करते, यह List(1, 1, 2, List(3, List(5, 8))) रिटर्न लेकिन यह List(1, 1, 2, 3, 5, 8) होना चाहिए।

क्या आप मुझे एक संकेत दे सकते हैं?

+0

यह एक व्यायाम के रूप में एक मजेदार है। असली कोड के लिए, निश्चित रूप से, 'list' पर _is_ एक 'flatten' विधि है। – AshleyF

+0

यह इस मामले में काम नहीं करेगा। यहां सूची 'सूची [कोई भी]' है, इसलिए आपको फ़्लैटन कॉल करने के लिए किसी भी => ट्रैवर्सबलऑन [_] से एक अंतर्निहित रूपांतरण परिभाषित करना होगा। यह संभव होना चाहिए लेकिन मुझे संदेह है कि यह इस कार्य से आसान है। – rjsvaljean

+0

कंपाइलर त्रुटियों और चेतावनियों पर एक नज़र डालें: वे कुछ बड़े संकेत देंगे –

उत्तर

9

हटाने लाइन द्वारा 4

case head :: Nil => List(head) 

आप सही जवाब मिल जाएगा।

परीक्षण का मामला

List(List(List(1))) 

लाइन 4 पिछले तत्व के साथ सूची में क्रियान्वित नहीं किए जाएँगे

26

आप घोंसला करने के लिए अपने मैच बयान की जरूरत नहीं है के बारे में सोचो। इसके बजाय मिलान में मिलान करें:

def flatten(xs: List[Any]): List[Any] = xs match { 
    case Nil => Nil 
    case (head: List[_]) :: tail => flatten(head) ++ flatten(tail) 
    case head :: tail => head :: flatten(tail) 
    } 
+0

बहुत ही सुरुचिपूर्ण समाधान, साझा करने के लिए धन्यवाद! – Ashalynd

15

मेरा, एसडीजेएमसीएचटी के समाधान के बराबर है।

def flatten(xs: List[Any]): List[Any] = xs match { 
    case List() => List() 
    case (y :: ys) :: yss => flatten(y :: ys) ::: flatten(yss) 
    case y :: ys => y :: flatten(ys) 
    } 
+3

मेरी राय में सबसे सुरुचिपूर्ण समाधान – Vic

+0

'(x :: ys) ::: yss' का अर्थ है' यदि यह किसी अन्य सूची के बाद तत्वों की सूची है '? (जैसा कि '()' का अर्थ है एक ट्यूपल AFAIK सूची नहीं है) –

1
def flatten(ls: List[Any]): List[Any] = ls flatMap { 
    case ms: List[_] => flatten(ms) 
    case e => List(e) 
    } 
संबंधित मुद्दे