2010-03-16 41 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) 
相关问题