2015-09-30 6 views
11

最近、自分でn個の要素のグループを繰り返し処理することなくコレクションを繰り返す必要があるとき、sliding(n、n)グループ化された(n)を使用してこれらのコレクションを反復する方が適切かどうか疑問に思っていました。私の質問は、パフォーマンスの面でこの特定のケースのために1つまたは別のものを使用する特別な理由があるかどうかです。あなたが「窓」を持っているとは異なる長さのものにしたいときScala:sliding(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

理由ではなくgroupedslidingは実際にのみ適用される使用することにより、何「スライド」(つまりsliding(m, n)m != nを使用して、と言うことです):SOM-snyttはコメントで指摘

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)) 

として、それらの両方が新しいGroupedIteratorをreturniningとしてIterator内に実装されているように、任意のパフォーマンスの違いがあるようにはないだろう。しかし、grouped(n)sliding(n, n)よりも簡単に書くことができるので、コードはより明確になり、意図した動作がより明確になるため、grouped(n)をお勧めします。

番号のリストを考えると、長さの任意のサブリストの最大の合計を見つける4.

:今、単に十分ではないgroupedこの例を検討し、slidingを使用する場所のための一例として、

sの、あなたがここにgroupedを使用した場合、あなたはすべてのサブリストを取得しないでしょう

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

:、動的プログラミングアプローチは、より効率的な結果を生み出すことができるという事実を脇に置く、これは、解決することができますo slidingがより適切です。

+3

実装はDRYなので、あなたはパフォーマンスのためにあなたが呼び出したものではありません。 https://github.com/scala/scala/blob/v2.11.7/src/library/scala/collection/Iterator.scala#L1039 –

+0

@ som-snytt知っておいてよかった!私はそれを更新します! – childofsoong

関連する問題