gpt4 book ai didi

scala - Scala 中二维向量的 indexOf

转载 作者:行者123 更新时间:2023-12-04 15:58:49 24 4
gpt4 key购买 nike

假设我想在 2D 向量中找到元素第一次出现的索引。

val table = Vector.tabulate(10, 10)((x,y) => 10*x + y)
val row = table indexWhere (_.indexOf(42) != -1) // row = 4
val col =
if(row == -1) -1
else table(row) indexOf 42 // col = 2

这似乎有点低效,因为 indexOf 在包含元素的行上被调用两次。有没有更好的方法来做到这一点而不必求助于命令式代码?

最佳答案

这不仅效率低下,而且还很危险。如果我们稍微修改一下呢?

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)

这可能太重要了,但它都变成了 flatMapfilter在引擎盖下。你可以用它来写,但这更具可读性。

编辑:如果您想要快速失败的行为,递归解决方案将符合要求:
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)
}

关于scala - Scala 中二维向量的 indexOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16411244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com