【问题标题】:Scala returning coordinate as tupleScala将坐标作为元组返回
【发布时间】:2016-07-15 23:40:16
【问题描述】:

我有一个 7 x 7 的网格,我必须解析一个填充网格的字符串。因此,如果我有一个包含 49 个元素的字符串,我需要将字符串转换为可用的网格。网格用如下所示的地图表示:

Map[(Int, Int), List[Int])]

这是我目前所拥有的:

   def parseHelper(str: String, x: Int, y: Int, lst: Map[(Int, Int), List[Int]]): Map[(Int,Int), List[Int]] = {
      str match{
      case "" => lst
      case _ => if (x == 6){
          if (str.charAt(0).equals('.')){
            parseHelper(str.substring(1), 0, y+1, lst + ((x, y) -> List(-1)))
          } else {
            print("str = " + str + " int = " + str(0) + " list = " + lst.head + "\n")
            parseHelper(str.substring(1), 0, y+1, lst + ((x,y) -> List(str(0))))
          }
      } else {
        if (str.charAt(0).equals('!')){
          parseHelper(str.substring(1), x+1, y, lst+((x, y) -> List(-1)))
        } else {
          print("str = " + str + " int = " + str(0) + " list = " + lst.head + "\n")
          parseHelper(str.substring(1), x+1, y, lst+((x,y) -> List(str(0))))
        }
     }
    }
  }

! 代表一个空白点,所以我们用-1 来表示它。

示例字符串:!!!!8!3!!!6!!7!!84!3!5!!2!9!!!1!54!8!!!!!!!!!4!27!6!!!3!1!!7!4!72!!4!!6!!!4!1!!!3

我用于调试的打印语句。问题是当我输入一个不是 -1 的 int 时,会输入一个从未出现在字符串中的数字。下面我有输出:

str = 8.3...6..7..84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 8 list = ((0,0),List(-1))
str = 3...6..7..84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 3 list = ((5,0),List(-1))
str = 6..7..84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 6 list = ((5,0),List(-1))
str = 7..84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 7 list = ((5,0),List(-1))
str = 84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 8 list = ((5,0),List(-1))
str = 4.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 4 list = ((7,1),List(56))
str = 3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 3 list = ((7,1),List(56))
str = 5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 5 list = ((7,1),List(56))
str = 2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 2 list = ((7,1),List(56))
str = 9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 9 list = ((7,1),List(56))
str = 1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 1 list = ((7,1),List(56))
str = 54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 5 list = ((7,1),List(56))
str = 4.8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 4 list = ((7,1),List(56))
str = 8.........4.27.6...3.1..7.4.72..4..6...4.1...3 int = 8 list = ((7,1),List(56))
str = 4.27.6...3.1..7.4.72..4..6...4.1...3 int = 4 list = ((7,1),List(56))
str = 27.6...3.1..7.4.72..4..6...4.1...3 int = 2 list = ((7,1),List(56))
str = 7.6...3.1..7.4.72..4..6...4.1...3 int = 7 list = ((7,1),List(56))
str = 6...3.1..7.4.72..4..6...4.1...3 int = 6 list = ((7,1),List(56))
str = 3.1..7.4.72..4..6...4.1...3 int = 3 list = ((7,1),List(56))
str = 1..7.4.72..4..6...4.1...3 int = 1 list = ((7,1),List(56))
str = 7.4.72..4..6...4.1...3 int = 7 list = ((7,1),List(56))
str = 4.72..4..6...4.1...3 int = 4 list = ((7,1),List(56))
str = 72..4..6...4.1...3 int = 7 list = ((7,1),List(56))
str = 2..4..6...4.1...3 int = 2 list = ((7,1),List(56))
str = 4..6...4.1...3 int = 4 list = ((7,1),List(56))
str = 6...4.1...3 int = 6 list = ((7,1),List(56))
str = 4.1...3 int = 4 list = ((7,1),List(56))
str = 1...3 int = 1 list = ((7,1),List(56))
str = 3 int = 3 list = ((7,1),List(56))

由于某种原因,数字 56 被输入到映射中,而字符串中甚至没有 56。

感谢您的帮助!

【问题讨论】:

  • str(0)返回字符串的第一个字符。 56 是字符 '8' 的 ASCII 码

标签: string scala dictionary pattern-matching


【解决方案1】:

您正在使用Char 的ASCII 代码。您想要的是使用str(0).asDigit,将其转换为数字。话虽这么说,你让这种方式太复杂了。你可以得到你想要的东西:

str.zipWithIndex.map{case (digit, index) => ((index / 7, index % 7), digit.asDigit)}.toMap

【讨论】:

    猜你喜欢
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多