2010-03-16 9 views

Odpowiedz

12

Scala 2.8 ma grouped że będzie kawałek dane w blokach o rozmiarze n (który może być stosowany w celu osiągnięcia each_slice funkcjonalność):

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 

nie ma nic, że będzie działać po wyjęciu z pudełka w 2,7 .X o ile dobrze pamiętam, ale jest to dość łatwe do zbudowania od take(n) i drop(n) z 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

Byłoby lepiej stworzyć klasę owijającą 'Array', która używała oryginalnego' Tablica' jako zaplecza, a obecnie tylko jego kawałek. Niejawna metoda "eachSlice" może być następnie dodana do 'Array', zwracając' List [ArraySlice] '. Czy nie chcesz, aby w twojej odpowiedzi padło pytanie? :-) Nie mogę dać ci więcej głosów, ale będę cię podziwiać. :-) :-) –

+0

@Daniel: Hahaha - tak, byłoby lepiej (szybciej), ale jeśli to nie będzie gdzieś w bibliotece (i dlaczego miałoby to być, ponieważ mamy już 'zgrupowane' w 2.8?), Myślę, że Zostawię to jako ćwiczenie dla czytelnika. –

+0

To działa lepiej w przypadku algorytmów lokalnych. Zawsze możesz przesłać go w celu ulepszenia do Scala. Lepiej jednak najpierw załóż formularz dla kontrybutora. Chciałbym zobaczyć taką opcję. –

6

Testowane z 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)