2010-03-16 7 views

उत्तर

12

स्काला 2.8 grouped है कि होगा हिस्सा आकार n (जो each_slice कार्यक्षमता प्राप्त करने के लिए इस्तेमाल किया जा सकता) के ब्लॉक में डेटा:

scala> val a = Array(1,2,3,4,5,6) 
a: Array[Int] = Array(1, 2, 3, 4, 5, 6) 

scala> a.grouped(2).foreach(i => println(i.reduceLeft(_ + _))) 
3 
7 
11 

वहाँ कुछ भी है कि 2.7 में बॉक्स से बाहर काम करेंगे नहीं है जहाँ तक मुझे याद है के रूप में .x, लेकिन यह बहुत take(n) से निर्माण करने के लिए आसान है और drop(n)RandomAccessSeq से:

def foreach_slice[A](s: RandomAccessSeq[A], n: Int)(f:RandomAccessSeq[A]=>Unit) { 
    if (s.length <= n) f(s) 
    else { 
    f(s.take(n)) 
    foreach_slice(s.drop(n),n)(f) 
    } 
} 

scala> val a = Array(1,2,3,4,5,6) 
a: Array[Int] = Array(1, 2, 3, 4, 5, 6) 

scala> foreach_slice(a,2)(i => println(i.reduceLeft(_ + _)))     
3 
7 
11 
+0

'ऐरे' रैपर वर्ग बनाना बेहतर होगा, जिसने मूल 'ऐरे' को बैक एंड के रूप में उपयोग किया था, जबकि वर्तमान में केवल इसका एक टुकड़ा था। एक 'अंतर्निहित' प्रत्येक स्लिस विधि को 'ऐरे' में जोड़ा जा सकता है, जिसमें 'सूची [ArraySlice] 'लौटाया जा सकता है। क्या आप अपने उत्तर में इसे नहीं जाना चाहते हैं? :-) मैं आपको अधिक वोट नहीं दे सकता, लेकिन मैं आपकी प्रशंसा करूंगा। :-) :-) –

+0

@ Daniel: हाहाहा - हाँ यह बेहतर होगा (तेज़), लेकिन अगर यह कहीं लाइब्रेरी में नहीं जा रहा है (और ऐसा क्यों होगा क्योंकि हम पहले ही 2.8 में समूहबद्ध हैं?), मुझे लगता है मैं इसे पाठक के लिए एक अभ्यास के रूप में छोड़ दूंगा। –

+0

यह जगह-जगह एल्गोरिदम के लिए बेहतर काम करेगा। आप इसे स्कैला में वृद्धि के लिए हमेशा जमा कर सकते हैं। पहले, योगदानकर्ता फॉर्म को बेहतर साइन अप करें। मैं ऐसे विकल्प को देखना चाहता हूं। –

6

स्काला 2.8 के साथ परीक्षण किया गया:

+०१२३५१६४१०६१
scala> (1 to 10).grouped(3).foreach(println(_)) 
IndexedSeq(1, 2, 3) 
IndexedSeq(4, 5, 6) 
IndexedSeq(7, 8, 9) 
IndexedSeq(10) 
संबंधित मुद्दे