コレクションをフィルタリングしたいので、隣接する要素間の距離は少なくとも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最後に必要です
これは基本的に、これを命令型の方法で実装する方法ですが、より簡潔な構文を使用します。