从列表中查找行的索引

时间:2013-11-30 09:18:57

标签: list scala search scala-collections

我试图从包含整数列表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}
}

2 个答案:

答案 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的更多详细信息(以及有关这与mapflatMap等有何关联的更全面的讨论。here

因此,如果您不想使用for循环,只需使用map将其“翻译”为等效表达式。 flatMapwithFilter

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 }