这不仅效率低下,而且很危险。如果我们稍微修改一下呢?
val row = table indexWhere (_.indexOf(101) != -1)
val col = table(row) indexOf 42 //Uh-oh, IndexOutOfBounds!
这似乎真的适合 for 表达式:
val z =
for {
i <- 0 until table.length
j <- 0 until table(i).length
if (table(i)(j) == 42)
} yield (i, j)
z.headOption.getOrElse(-1, -1)
这可能过于迫切,但这一切都会转化为引擎盖下的flatMap
内容。filter
您可以用它来编写它,但这更具可读性。
编辑:如果您想要快速失败的行为,递归解决方案将符合要求:
def findElement(table: Vector[Vector[Int]], elem: Int): (Int, Int) = {
@tailrec
def feRec(row: Int, col: Int): (Int, Int) = {
if (row == table.length) (-1, -1)
else if (col == table(row).length) feRec(row + 1, 0)
else if (table(row)(col) == elem) (row, col)
else feRec(row, col + 1)
}
feRec(0, 0)
}