List Scala在由电路板表示的地图上迭代
我制作了一个函数,可以解析81个字符长的字符串。在解析它时,我需要使用一个名为List Scala在由电路板表示的地图上迭代,list,scala,dictionary,List,Scala,Dictionary,我制作了一个函数,可以解析81个字符长的字符串。在解析它时,我需要使用一个名为neights(Int:row,Int:col)的函数,该函数返回指定行和列的所有垂直、水平和对角坐标。使用此坐标列表,我需要从每个坐标处列出的每个可能值中删除放置的值。董事会被表示为一个映射,我需要在功能上做到这一点,即不使用var 下面是我的解析函数: str.zipWithIndex.map{ case (digit, index) => ((index / 9, index % 9), List(
neights(Int:row,Int:col)
的函数,该函数返回指定行和列的所有垂直、水平和对角坐标。使用此坐标列表,我需要从每个坐标处列出的每个可能值中删除放置的值。董事会被表示为一个映射,我需要在功能上做到这一点,即不使用var
下面是我的解析函数:
str.zipWithIndex.map{
case (digit, index) => ((index / 9, index % 9), List(digit.asDigit))
}.toMap
def neighbors(row: Int, col: Int): List[(Int, Int)]
以下是我对邻居
函数的了解:
str.zipWithIndex.map{
case (digit, index) => ((index / 9, index % 9), List(digit.asDigit))
}.toMap
def neighbors(row: Int, col: Int): List[(Int, Int)]
例如,如果解析器位于坐标(0,2)
,并且输入到地图中的数字是4
,则我必须从该点的所有垂直、水平和对角线坐标中删除4
。每个点的值都表示为可能值的列表
我也没有得到neighbor
函数的实现
谢谢你的帮助 如果我正确理解了你的问题,那是关于如何在保持功能的同时改变事物(在本例中,从
映射中删除)
如果是,有两种方法:
创建尾部递归函数,该函数为每次迭代调用,包含要处理的剩余元素列表和“可变”数据的当前状态:
或者您也可以使用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
的初始状态包含板的初始状态和结果的空列表
第一,我认为这是一个更好的解析器设计。第二,在没有看到确切的签名或至少返回数据类型的情况下,很难建议如何使用neighbor
函数。第三-您无法从尚未填充的坐标中删除任何内容,因此,从您的描述来看,neighbor
必须在parse
完成后对每个元素调用。我同意,Karl的建议非常好。我想出了如何用列表填充空单元格。当我发布这个问题时,我还没有弄明白。我会更新这个问题。此外,我还将添加邻居
函数的签名。谢谢