我试图从包含整数列表List[List[Int]]
的列表中使用Scala获取行的索引。我已经有两个函数将行索引/列索引和网格作为参数,它输出该行中的所有元素。我需要的是一个给定特定元素的函数(例如:0
),它找到它的行索引和列索引并将它们放在一个列表中:List[(Int, Int)]
。我试图编写一个函数,当遇到0时返回索引,然后我将函数传递给整个网格。我不知道我是否采取了正确的方式。另外,我无法弄清楚如何返回列表。
另外,我不能使用任何循环。
提前致谢。
def Possibilities(): List[Int] = {
def getRowIndex(elem: Int): Int = elem match
{
case 0 => sudoku.grid.indexOf(sudoku.row(elem))
case x => x
}
val result1 = sudoku.grid map {row => row map getRowIndex}
}
答案 0 :(得分:0)
我认为使用两个维度,用for
理解来编写这样的方法要容易得多。
给出List[List[Int]]
这样的:
val grid = List(
List(1, 2, 3),
List(4, 5, 6),
List(3, 2, 1))
我们可以简单地遍历所有行和列,并检查每个元素是否是我们正在寻找的元素:
def possibilities(findElem: Int): List[(Int, Int)] = {
for (
(row, rowIndex) <- grid.zipWithIndex;
(elem, colIndex) <- row.zipWithIndex
if elem == findElem
) yield (rowIndex, colIndex)
}
yield
关键字会创建for
循环结果的集合。您可以找到有关Scala的for
循环语法here的更多详细信息(以及有关这与map
,flatMap
等有何关联的更全面的讨论。here)
因此,如果您不想使用for
循环,只需使用map
将其“翻译”为等效表达式。 flatMap
和withFilter
:
def possibilities(findElem: Int): List[(Int, Int)] = {
grid.zipWithIndex flatMap { rowAndIndex =>
rowAndIndex._1.zipWithIndex.withFilter(_._1 == findElem) map { colAndIndex =>
(rowAndIndex._2, colAndIndex._2)
}
}
}
答案 1 :(得分:0)
步骤1,创建一个所有可能的索引元组的集合,for
理解(for
看起来像一个循环,但它不是)
val tuples = for (i <- grid.indices; j <- grid.head.indices) yield (i, j)
第2步,过滤此集合
tuples.filter { case (i, j) => grid(i)(j) == valueToFind }