4

コレクションをフィルタリングしたいので、隣接する要素間の距離は少なくとも5になります。

だからList(1, 2, 3, 4, 5, 6, 7, 11, 20)になりList(1, 6, 11, 20)ます。

フィルタを使用してワンパスで達成することは可能ですか?Scala-wayとは何でしょうか?

4

2 に答える 2

7

このワンライナーはどうですか:

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)
于 2013-02-04T21:43:19.697 に答える
5

試してみてください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

明らかでない場合:

  1. outputアルゴリズムは、コレクションの最初の要素(おそらく、いくつかのエッジケースを処理する必要があります)から始まります

  2. からの残りのすべての要素を繰り返し処理しますinputcurこの要素( )との最初の要素の差が、input以上の場合は、の前に。5を追加しinputます。それ以外の場合はスキップして続行します

  3. inputパフォーマンスを向上させるために、先頭に追加して調べることによって構築されheadました。.reverse最後に必要です

これは基本的に、これを命令型の方法で実装する方法ですが、より簡潔な構文を使用します。

于 2013-02-04T21:30:48.660 に答える