2015-09-30 3 views
11

В последнее время я обнаружил, что я использовал скользящие (n, n), когда мне нужно итерировать коллекции в группах из n элементов без повторной обработки каких-либо из них. Мне было интересно, было бы правильнее перебирать эти коллекции, используя grouped (n). Мой вопрос в том, есть ли специальная причина использовать тот или иной конкретный случай с точки зрения производительности.Scala: slide (N, N) vs сгруппировано (N)

val listToGroup = List(1,2,3,4,5,6,7,8) 
listToGroup: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8) 

listToGroup.sliding(3,3).toList 
res0: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8)) 

listToGroup.grouped(3).toList 
res1: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8)) 

ответ

7

Причина использовать sliding вместо grouped действительно только в том случае, если вы хотите иметь «окна» быть длиной, отличной от того, что вы «слайд» из (то есть, используя sliding(m, n) где m != n):

listToGroup.sliding(2,3).toList 
//returns List(List(1, 2), List(4, 5), List(7, 8)) 

listToGroup.sliding(4,3).toList 
//returns List(List(1, 2, 3, 4), List(4, 5, 6, 7), List(7, 8)) 

Как сома-snytt указывает на комментарий, там не будет никакой разницы в производительности, так как оба они реализуются в Iterator, как returnining новый GroupedIterator. Тем не менее, проще написать grouped(n), чем sliding(n, n), поэтому ваш код будет более чистым и более понятным по своему назначению, поэтому я бы порекомендовал grouped(n).

В качестве примера, где использовать sliding, рассмотрим следующий пример, где grouped просто не хватает:

Учитывая список чисел, найти наибольшую сумму любого подсписка длины 4.

сейчас , отложив в сторону тот факт, что динамическое программирование подход может обеспечить более эффективный результат, это может быть решена как:

def maxLengthFourSublist(list: List[Int]) = { 
    list.sliding(4,1).map(_.sum).max 
} 

Если вы должны были использовать grouped здесь, вы бы не получить все подсписки, с o sliding является более подходящим.

+3

Реализация DRY, поэтому не имеет значения, что вы называете, для производительности. https://github.com/scala/scala/blob/v2.11.7/src/library/scala/collection/Iterator.scala#L1039 –

+0

@ som-snytt хорошо знать! Я обновлю это! – childofsoong

Смежные вопросы