1. ホーム
  2. scala

[解決済み] Scala: スライド(N,N) vs グループ化(N)

2022-02-10 01:51:52

質問

最近、コレクションを再処理することなくn個の要素で反復処理する必要があるときに、sliding(n,n)を使っていることに気づきました。私は、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))

解決方法は?

を使用する理由 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))

コメントでsom-snyttさんが指摘されているように、どちらも Iterator を返すように、新しい GroupedIterator . しかし、次のように書く方が簡単です。 grouped(n) よりも sliding(n, n) を使用すると、コードがきれいになり、意図した動作がより明確になるので、お勧めします。 grouped(n) .

を使用する例として sliding この問題を考えてみましょう。 grouped では不十分なのです。

数字のリストがあるとき、長さ4のサブリストで和が最大となるものを求めよ。

さて、動的計画法の方が効率的に結果を出せるということは置いておいて、これは次のように解くことができる。

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

もし、あなたが grouped では、すべてのサブリストを取得することはできませんので sliding がより適切です。