2010-03-16 34 views

回答

12

的Scala 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

最好是創建一個'Array'封裝類,它使用原始'Array'作爲後端,而目前只有一部分。然後可以將隱式'eachSlice'方法添加到'Array',返回'List [ArraySlice]'。你不想在你的答案中去看看嗎? :-)我不能給你更多的選票,但我很佩服你。 :-) :-) – 2010-03-16 18:19:22

+0

@Daniel:哈哈哈 - 是的,它會更好(更快),但是如果它不在圖書館某處(爲什麼會因爲我們已經在2.8中進行了分組?),我認爲我將把它作爲讀者的練習。 – 2010-03-16 18:37:12

+0

這對於就地算法會更好。您可以隨時將其提交給Scala。不過,請首先更好地註冊貢獻者表單。我希望看到這樣的選項。 – 2010-03-16 19:23:32

6

測試使用Scala 2.8:

scala> (1 to 10).grouped(3).foreach(println(_)) 
IndexedSeq(1, 2, 3) 
IndexedSeq(4, 5, 6) 
IndexedSeq(7, 8, 9) 
IndexedSeq(10) 
相關問題