加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中2D Vector的indexOf

发布时间:2020-12-16 09:49:10 所属栏目:安全 来源:网络整理
导读:假设我想找到2D矢量中第一次出现元素的索引. val table = Vector.tabulate(10,10)((x,y) = 10*x + y)val row = table indexWhere (_.indexOf(42) != -1) // row = 4val col = if(row == -1) -1 else table(row) indexOf 42 // col = 2 这似乎有点低效,因为in
假设我想找到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-expression:

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并在引擎盖下过滤.你可以用它写它,但这更具可读性.

编辑:如果您想要快速失败的行为,递归解决方案将适合该法案:

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)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读