2015-09-30 18 views
11

Recentemente, mi sono ritrovato a usare sliding (n, n) quando ho bisogno di iterare le raccolte in gruppi di n elementi senza rielaborarli. Mi stavo chiedendo se sarebbe più corretto iterare quelle collezioni usando grouped (n). La mia domanda è se c'è un motivo speciale per utilizzare l'uno o l'altro per questo caso specifico in termini di prestazioni.Scala: sliding (N, N) vs grouped (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)) 

risposta

7

La ragione per usare sliding invece di grouped è davvero applicabile solo quando si desidera avere le 'finestre' essere di lunghezza diversa da quello che 'slide' di (vale a dire, usando sliding(m, n) dove 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)) 

come sottolinea som-snytt in un commento, non ci sara 'alcuna differenza di prestazioni, come ciascuno di essi sono implementati all'interno Iterator come returnining un nuovo GroupedIterator. Tuttavia, è più semplice scrivere grouped(n) rispetto a sliding(n, n), quindi il codice sarà più pulito e più ovvio nel suo comportamento previsto, quindi consiglierei grouped(n).

Come esempio di dove utilizzare sliding, considerare questo esempio in cui grouped semplicemente non è sufficiente:

Dato un elenco di numeri, trovare il più grande somma di qualsiasi elenco secondario di lunghezza 4.

Ora , mettendo da parte il fatto che un approccio di programmazione dinamica in grado di produrre un risultato più efficiente, questo può essere risolto come:

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

Se si sceglie di usare grouped qui, si sarebbe non ottenere tutti i sottoliste, s o sliding è più appropriato.

+3

L'implementazione è ASCIUTTA, quindi non importa quale chiami, per le prestazioni. https://github.com/scala/scala/blob/v2.11.7/src/library/scala/collection/Iterator.scala#L1039 –

+0

@ som-snytt buono a sapersi! Aggiornerò con quello! – childofsoong

Problemi correlati