Scala 具有潜在未定义索引的向量访问
在Scala中,我有一个Scala 具有潜在未定义索引的向量访问,scala,Scala,在Scala中,我有一个网格,它由二维向量表示 现在我想定义一个方法,该方法测试给定的行和列是否是网格的一部分,并满足特定条件(在这种情况下,如果数字是>0) 理想情况下,我想做以下工作: g(row)(col) > 0 但是,如果索引超出向量的界限,则会导致异常 我想到的是: def isGt0(g: Grid, row: Int, col: Int) = { if(g.isDefinedAt(row) && g(row).isDefinedAt(col)) g(r
网格
,它由二维向量
表示
现在我想定义一个方法,该方法测试给定的行
和列
是否是网格
的一部分,并满足特定条件(在这种情况下,如果数字是>0
)
理想情况下,我想做以下工作:
g(row)(col) > 0
但是,如果索引超出向量的界限,则会导致异常
我想到的是:
def isGt0(g: Grid, row: Int, col: Int) = {
if(g.isDefinedAt(row) && g(row).isDefinedAt(col)) g(row)(col) > 0
else false
}
有更好的方法吗
可以找到完整的示例。以下内容或多或少与您所拥有的内容相同,但(至少可以说)更加惯用:
def isGt0(g: Grid, row: Int, col: Int) =
g.lift(row).flatMap(_.lift(col)).fold(false)(_ > 0)
这是因为Vector[A]
是从Int
到A
的部分函数。我们可以使用.lift
方法将其作为从Int
到选项[a]
的一个总函数,如果超出范围,则得到None
。我们使用flatMap
一元链接两个请求,并使用fold
检查是否有值,否则返回false
但是,这两个版本的效率都不是很高,如果您经常这样做并且性能很重要,您可能需要简单的旧边界检查。您可以先删除if/else、g.isDefinedAt(row)和&g(row)。isDefinedAt(col)和&g(row)(col)>0
。谢谢您的回答。虽然我不得不承认我有点不太自信,但我希望事情会简单得多。我想我有点被Scala宠坏了。。。