在二维集合中查找元素(不带var)

时间:2013-05-08 00:37:43

标签: scala

我有一个二维集合(比如Vector[Vector[Int]]),我想在其中找到元素的索引。我的解决方案就像:

def find(vec: Vector[Vector[Int]], target: Int) = {
  def indexOfTarget(v: Vector[Int]) = v.indexOf(target)

  val r = vec.indexWhere((v) => indexOfTarget(v) != -1)
  val c = indexOfTarget(vec(r))

  (r, c)
}

但它只是......丑陋。它会再次调用indexOfTarget一次。

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

怎么样:

vec.view.zipWithIndex.map {
  case (iv,i) => (i, iv.indexOf(target))
}.find(_._2 != -1)

请注意,由于viewzipWithIndexmap会被懒惰地评估,因此只会进行绝对必要的计算。

答案 1 :(得分:0)

你可以试试这个:

def find(vec: Vector[Vector[Int]], target: Int) = {
  val zipped = vec.zipWithIndex
  val result = for{
    tup <- zipped
    index <- List(tup._1.indexOf(target))
    if (index != -1)
  } yield (tup._2, index)
  result.headOption
}

结果类型为Option[(Int,Int)],如果不匹配则为None

答案 2 :(得分:0)

如果元素存在则返回Some((x, y))的实现,否则返回None

def find(vec: Vector[Vector[Int]], target: Int) = (for {
  (xs, posX) <- vec.view.zipWithIndex
  (`target`, posY)  <- xs.view.zipWithIndex
} yield (posX, posY) ).headOption


scala> find(Vector(Vector(1, 2, 4), Vector(2, 2, 3)), 3)
res0: Option[(Int, Int)] = Some((1,2))