【发布时间】:2010-03-16 16:16:35
【问题描述】:
Scala 是否有来自 Array 类的 Rubys 的 each_slice 版本?
【问题讨论】:
标签: ruby collections scala scala-2.8
Scala 是否有来自 Array 类的 Rubys 的 each_slice 版本?
【问题讨论】:
标签: ruby collections scala scala-2.8
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
【讨论】:
Array 包装类,它使用原始的Array 作为后端,而目前只是其中的一部分。然后可以将隐式eachSlice 方法添加到Array,返回List[ArraySlice]。您不想在答案中尝试一下吗? :-) 我不能给你更多的选票,但我很佩服你。 :-) :-)
grouped?),我我想我会把它作为练习留给读者。
使用 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)
【讨论】: