コレクションをフィルタリングしたいので、隣接する要素間の距離は少なくとも5になります。
だからList(1, 2, 3, 4, 5, 6, 7, 11, 20)
になりList(1, 6, 11, 20)
ます。
フィルタを使用してワンパスで達成することは可能ですか?Scala-wayとは何でしょうか?
コレクションをフィルタリングしたいので、隣接する要素間の距離は少なくとも5になります。
だからList(1, 2, 3, 4, 5, 6, 7, 11, 20)
になりList(1, 6, 11, 20)
ます。
フィルタを使用してワンパスで達成することは可能ですか?Scala-wayとは何でしょうか?
このワンライナーはどうですか:
scala> l.foldLeft(Vector(l.head)) { (acc, item) => if (item - acc.last >= 5) acc :+ item else acc }
res7: scala.collection.immutable.Vector[Int] = Vector(1, 6, 11, 20)
試してみてくださいfoldLeft()
:
val input = List(1, 2, 3, 4, 5, 6, 7, 11, 20)
input.tail.foldLeft(List(input.head))((out, cur) =>
if(cur - out.head >= 5) cur :: out else out
).reverse
明らかでない場合:
output
アルゴリズムは、コレクションの最初の要素(おそらく、いくつかのエッジケースを処理する必要があります)から始まります
からの残りのすべての要素を繰り返し処理しますinput
。cur
この要素( )との最初の要素の差が、input
以上の場合は、の前に。5
を追加しinput
ます。それ以外の場合はスキップして続行します
input
パフォーマンスを向上させるために、先頭に追加して調べることによって構築されhead
ました。.reverse
最後に必要です
これは基本的に、これを命令型の方法で実装する方法ですが、より簡潔な構文を使用します。