2010-03-16 4 views

ответ

12

Скала 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]'. Разве вы не хотите идти на это в ответ? :-) Я не могу дать вам больше голосов, но я буду восхищаться вами. :-) :-) –

+0

@ Daniel: Hahaha - да, это было бы лучше (быстрее), но если оно не будет в библиотеке где-нибудь (и почему бы это сделать, поскольку мы уже «сгруппировали» в 2.8?), Я думаю Я оставлю это упражнение для читателя. –

+0

Это было бы лучше для локальных алгоритмов. Вы всегда можете отправить его для улучшения в Scala. Лучше зарегистрировать форму участника сначала. Я бы хотел, чтобы такой вариант был доступен. –

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) 
Смежные вопросы