2010-03-16 7 views

Respuesta

12

Scala 2.8 tiene grouped que va a trozo de los datos en bloques de tamaño n (que puede ser utilizado para lograr each_slice funcionalidad):

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 

no hay nada que va a funcionar fuera de la caja en 2,7 .x por lo que yo recuerdo, pero es bastante fácil de construir a partir de take(n) y drop(n) de 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

Sería mejor crear una clase de envoltura 'Array', que utilizaba el' Array' original como el back-end, aunque actualmente solo una parte del mismo. Un método 'eachSlice' implícito podría agregarse luego a' Array', y devolver 'List [ArraySlice]'. ¿No quieres intentarlo en tu respuesta? :-) No puedo darte más votos, pero te admiro. :-) :-) –

+0

@Daniel: Jajaja - sí, eso sería mejor (más rápido), pero si no va a una biblioteca en algún lugar (¿y por qué lo haría ya que ya tenemos 'agrupado' en 2.8?), Creo Lo dejaré como un ejercicio para el lector. –

+0

Funcionaría mejor para los algoritmos in situ. Siempre puede enviarlo para mejorar Scala. Sin embargo, es mejor inscribirse primero en el formulario de contribuyente. Me gustaría ver tal opción disponible. –

6

probado con 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) 
Cuestiones relacionadas