List Scala在由电路板表示的地图上迭代

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(

我制作了一个函数,可以解析81个字符长的字符串。在解析它时,我需要使用一个名为
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的建议非常好。我想出了如何用列表填充空单元格。当我发布这个问题时,我还没有弄明白。我会更新这个问题。此外,我还将添加
    邻居
    函数的签名。谢谢