Czy Scala ma wersję Rubys 'each_slice z klasy Array?Scala wersja Rubys "each_slice?
8
A
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
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)
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ć. :-) :-) –
@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. –
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ę. –