首页 > 解决方案 > 如何从Scala中的向量向量中获取元素的索引?

问题描述

我有这个数据结构编码平面中元素的存在/不存在:

val rows = Vector(
  Vector("-", "-", "-", "-"),
  Vector("-", "-", "X", "-"),
  Vector("-", "-", "-", "-"))

我想得到一对“X”的坐标。假设左上角是(0,0)

我试图通过这样的理解来得到结果:

for
  row <- rows
  rowIndex <- 0 until rows.length
  colIndex = row.indexOf("X")
  if (colIndex > -1)
yield (rowIndex, colIndex)

这正确地找到了colIndex,但我需要以某种方式将 绑定rowIndex到特定的row. 现在,它独立地迭代row元素,rows.length 次。

第二个问题:如果有多个元素,我们正在寻找,如何让它在找到第一个后停止搜索?结果应该只是一对(row, col)

标签: scalafor-comprehensionscala-3

解决方案


利用Vectors可以通过索引快速访问的优势,您可以执行以下操作:

def firstIndexWhere[A](data: Vector[Vector[A]])(cond: A => Boolean): Option[(Int, Int)] =
  Iterator.range(start = 0, end = data.length).flatMap { i =>
    Iterator.range(start = 0, end = data(i).length).map { j =>
      (i, j)
    }
  } find {
    case (i, j) =>
      cond(data(i)(j))
  }

这将有效地停止在第一个成功的索引处。

另一种方法可能是:

def firstIndexWhere[A](data: Vector[Vector[A]])(cond: A => Boolean): Option[(Int, Int)] =
  data.iterator.zipWithIndex.map {
    case (row, i) =>
      row.iterator.zipWithIndex.collecFirst {
        case (elem, j) if (cond(elem)) => (i, j)
      }
  } collectFirst {
    case Some(indexes) => indexes
  }

推荐阅读