2012-09-26 18 views
30

स्कैला (2.9) में सूची की सूची को बदलने का सबसे अच्छा तरीका क्या है?स्कैला - सूचीओं की सूची एक सूची में बदलें: सूची [सूची [ए]] सूची [ए]

मैं एक सूची है:

List[List[A]] 

जो मैं

List[A] 

में परिवर्तित करने के लिए कैसे है कि रिकर्सिवली प्राप्त किया जा सकता हैं? या कोई और बेहतर तरीका है?

उत्तर

41

सूची में फ़्लैटन विधि है। इसका इस्तेमाल क्यों नहीं करें?

List(List(1,2), List(3,4)).flatten 
> List(1,2,3,4) 
+1

कैसे आप इस 'सूची समतल (1, सूची (2,3), 4, सूची (5,6,7))' की उम्मीद है नतीजा 'सूची (1, 2, 3, 4, 5,6,7) ' –

+2

उपरोक्त सूची विषम है, वहां पर काम नहीं करेगा। आप कुछ ऐसा कर सकते हैं: सूची (1, सूची (2,3), 4, सूची (5,6,7))। संग्रह {केस i: Int => सूची (i); केस एल @ ए :: बी => एल} .flatten – Jan

10

उपरोक्त उदाहरण को देखते हुए, मुझे यकीन नहीं है कि आपको रिकर्सन की आवश्यकता है। ऐसा लगता है कि आप इसके बजाय List.flatten चाहते हैं।

उदा।

scala> List(1,2,3) 
res0: List[Int] = List(1, 2, 3) 

scala> List(4,5,6) 
res1: List[Int] = List(4, 5, 6) 

scala> List(res0,res1) 
res2: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6)) 

scala> res2.flatten 
res3: List[Int] = List(1, 2, 3, 4, 5, 6) 
10

.flatten स्पष्ट रूप से सबसे आसान तरीका है, लेकिन पूर्णता के लिए आप के बारे में भी flatMap

val l = List(List(1, 2), List(3, 4)) 
println(l.flatMap(identity)) 

पता होना चाहिए और के लिए-समझ बराबर

println(for (list <- l; x <- list) yield x) 

समतल स्पष्ट रूप से एक विशेष मामला है flatMap का, जो बहुत कुछ कर सकता है।

+0

यदि आप मानचित्र के दौरान कुछ डेटा जोड़ना चाहते हैं तो यह वही है जो आप चाहते हैं। –

0

आप प्रत्यावर्तन की आवश्यकता नहीं है लेकिन आप इसे उपयोग कर सकते हैं अगर आप चाहते हैं:

def flatten[A](list: List[List[A]]):List[A] = 
    if (list.length==0) List[A]() 
    else list.head ++ flatten(list.tail) 

इस समतल विधि सूची में निर्माण की तरह काम करता है। उदाहरण:

scala> flatten(List(List(1,2), List(3,4))) 
res0: List[Int] = List(1, 2, 3, 4) 
0

अपने संरचना आगे की तरह नेस्ट किया जा सकता है, तो:

List(List(1, 2, 3, 4, List(5, 6, List(7, 8)))) 

इस समारोह आप इच्छा परिणाम देना चाहिए:

def f[U](l: List[U]): List[U] = l match { 
    case Nil => Nil 
    case (x: List[U]) :: tail => f(x) ::: f(tail) 
    case x :: tail => x :: f(tail) 
} 
0

आप flatmap उपयोग करना चाहते हैं यहाँ,

मान लीजिए कि आपके पास सूची [Int] नाम की सूची है, और आप इसे सूची में फ्लैट करना चाहते हैं, कई लोग पहले से ही आपको जवाब देते हैं, जैसे फ़्लैटन, यह आसान तरीका है। मुझे लगता है कि आप फ्लैटमैप विधि का उपयोग करने के लिए पूछ रहे हैं। यदि यह मामला है, यहाँ जिस तरह से

ll.flatMap(_.map(o=>o)) 
+0

यह उत्तर 5 साल पहले डेव ग्रिफिथ द्वारा दिए गए उत्तर से अलग कैसे है?(इस तथ्य के अलावा कि पुराना उत्तर क्लीनर और अधिक संक्षिप्त है।) – jwvh

+0

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

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