我已经创建了一个解析长度为81个字符的字符串的函数。解析它时,我需要使用一个名为neighbors(Int: row, Int: col)
的函数,它返回指定行和列的垂直,水平和对角线的所有坐标。使用此坐标列表,我需要从每个坐标列出的每个可能值中删除我放置的值。该板表示为一个映射,我需要在功能上执行此操作,即不使用var。
这是我的解析功能:
str.zipWithIndex.map{
case (digit, index) => ((index / 9, index % 9), List(digit.asDigit))
}.toMap
以下是我对neighbors
函数的了解:
def neighbors(row: Int, col: Int): List[(Int, Int)]
例如,如果解析器位于坐标(0,2)
上,并且输入到地图中的数字为4
,则必须从垂直,水平的所有坐标中删除4
,从那一点开始的对角线。每个点的值都表示为可能值的列表。
我也没有得到neighbor
函数的实现。
感谢您的帮助!
答案 0 :(得分:1)
如果我正确地理解了你的问题,它是关于如何在保持功能的同时改变事物(在这种情况下从Map
删除)?
如果是,有两种方法:
创建为每次迭代调用的尾递归函数,其中包含要处理的剩余元素列表以及" mutable"的当前状态。数据:
@tailrec
def process(
input: List[(Char, Int)],
board: Map[Any, Any],
resultAccum: List[Result]): List[Result] = input match {
case Nil => resultAccum.reverse
case (char, pos) :: tail =>
// do the processing
val updatedBoard = board - ??? // create update version of the board
val updateResults = ??? :: resultAccum
process(tail, updatedBoard, updateResults)
}
或者您可以使用foldLeft
,这样做但看起来更短:
input.foldLeft((initialBoard, List[Result]())) {
case ((board, resultsAccum), (char, pos)) =>
val updatedBoard = board - ??? // create update version of the board
val updateResults = ??? :: resultsAccum
(updatedBoard, updateResults)
}._2.reverse
foldLeft
的初始状态包含董事会的初始状态和空的结果列表。