我有一个二维集合(比如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
一次。
有更好的方法吗?
答案 0 :(得分:3)
怎么样:
vec.view.zipWithIndex.map {
case (iv,i) => (i, iv.indexOf(target))
}.find(_._2 != -1)
请注意,由于view
,zipWithIndex
和map
会被懒惰地评估,因此只会进行绝对必要的计算。
答案 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))