scala - 如何从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)
。
解决方案
利用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
}
推荐阅读
- reactjs - 安装 React-Redux 会导致 chokidar 问题
- javascript - 为什么我的
- python - 使用glob,image_slicer根据像素大小对目录中的图像进行切片,而不是指定要拼接的图像数量?
- excel - 尝试运行自动排除标准偏差之外的任何数字的平均值
- javascript - 使用javascript的split方法避免字符串“null”
- reactjs - 如何在 Recharts 条形图中的每个分组条之间获得内部填充(或间隙)?
- rust - 如何在 Rust 中创建包含引用字段的新实例?
- android - Kotlin - 多项选择测验中的条件 ImageView
- django - 如何只显示查询集中的值?
]> - python - 如何从 bs4 汤对象解码 utf-8 文本?