5

特定の int のベクトルのベクトルを検索しています。

  def searchVectors(i: Int, vectors: Vector[Vector[Int]]) = {
    val x = vectors.indexWhere(_.indexWhere(_ == i))
    val y = vectors(x).indexOf(y)
    (x, y)
  }

y を 2 回取得していることがわかります。最初に x を計算するとき、次に y を計算するときにもう一度。良くない。y を 1 回だけ計算するにはどうすればよいですか?

ありがとう

4

4 に答える 4

8

あなたが取ることができる1つのアプローチは、すべてのベクトルを繰り返すことです:

def searchVectors(x: Int, vec: Vector[Vector[Int]]) =
  for {
    i <- 0 until vec.size
    j <- 0 until vec(i).size
    if vec(i)(j) == x
  } yield (i, j)

VectorzipWithIndexには、コレクションの各要素にインデックスを追加し、それらのタプルを作成するメソッドもあります。したがって、同じものをアーカイブするために使用できます。

def searchVectors(x: Int, vec: Vector[Vector[Int]]) =
  for {
    (subVec, i) <- vec.zipWithIndex
    (elem, j) <- subVec.zipWithIndex
    if elem == x
  } yield (i, j)

このアプローチの利点は、外部 (インデックスベース) ループの代わりに、map/を使用して内部ループを使用していることですflatMap。ビューと組み合わせる場合は、遅延検索を実装できます。

def searchVectors(x: Int, vec: Vector[Vector[Int]]) =
  for {
    (subVec, i) <- vec.view.zipWithIndex
    (elem, j) <- subVec.view.zipWithIndex
    if elem == x
  } yield (i, j)

結果のコレクションを受け取ることはできませんが、これは遅延コレクションです。したがって、次のような頭を取る場合:

searchVectors(3, vector).headOption

実際に検索を実行し (この時点でのみ)、見つかった場合は として返されOptionます。これ以上の検索は実行されません。

于 2013-05-12T11:35:17.787 に答える
2

これも私を悩ませました。すでに考えたことがあるかもしれませんが、不変状態などの関数型プログラミングの原則に違反したい場合は、次の 1 つのアプローチが考えられます。

val v = Vector(Vector(1,2,3), Vector(4, 5, 6))
var c: Int = -1
val r = v.indexWhere(r => {c = r.indexOf(6); c != -1})
(r, c)
于 2018-10-25T17:12:23.553 に答える