2015-09-30 22 views
11

Zdarzyło mi się, że ostatnio używam przesuwanego (n, n), gdy potrzebuję powtórzyć kolekcje w grupach n elementów bez ponownego przetwarzania żadnego z nich. Zastanawiam się, czy byłoby bardziej poprawne iterowanie tych kolekcji przy użyciu grupowania (n). Moje pytanie brzmi, czy istnieje szczególny powód, aby skorzystać z tego czy innego w tym konkretnym przypadku pod względem wydajności.Scala: przesuwne (N, N) kontra zgrupowane (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)) 

Odpowiedz

7

Powodem korzystania sliding zamiast grouped jest naprawdę zastosowanie tylko, gdy chcemy mieć „Windows” być o długości innej niż to, co „slide” przez (to znaczy, używając sliding(m, n) gdzie 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)) 

jak som-snytt zwraca uwagę w komentarzu, że nie będzie żadnej różnicy wydajności, jak oboje są realizowane w ciągu Iterator jak returnining nowy GroupedIterator. Jednak łatwiej jest napisać grouped(n) niż sliding(n, n), więc Twój kod będzie czystszy i bardziej oczywisty w zamierzonym działaniu, dlatego polecam grouped(n).

Jako przykład gdzie używać sliding rozważyć ten przykład gdzie grouped po prostu nie wystarcza:

otrzymali listę numerów, znajdź największą sumę długości dowolnego podmenu 4.

teraz , pomijając fakt, że dynamiczne podejście do programowania może produkować bardziej wydajne wynik ten może być rozwiązany jak:

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

Jeśli było użyć grouped tu, by nie dostać wszystkich list podrzędnych s o sliding jest bardziej odpowiednie.

+3

Implementacja jest SUCHA, więc nie ma znaczenia, do kogo zadzwonisz, w celu uzyskania wydajności. https://github.com/scala/scala/blob/v2.11.7/src/library/scala/collection/Iterator.scala#L1039 –

+0

@ som-snytt Warto wiedzieć! Zaktualizuję to! – childofsoong

Powiązane problemy