【问题标题】:Using maps in Scala在 Scala 中使用地图
【发布时间】:2015-03-18 15:33:22
【问题描述】:
val nums = Map('M' -> 1000, 'D' -> 500, 'C' -> 100, 'L' -> 50, 'X' -> 10, 'V' -> 5, 'I' -> 1)
def convert(data : String):Int = {
    var count = 0;
    var index = 0;
    var list: List[Char] = List();

    for((value,index) <- data.reverse.zipWithIndex){
        list = value :: list;
    }

    def calcRM(rm : List[Char]): List[Char] = rm match{
        case x :: Nil => x
        case x :: tail => ???
        case Nil => Nil
    }

    return count        
    }
}

我想知道如何使用提供的Map 转换从x(head)tail.head 获得的值,以便我可以将字符串转换为罗马数字中的值。

【问题讨论】:

    标签: scala match head tail


    【解决方案1】:

    要访问地图,您只需使用其get 方法:

    nums.get(x) 
    

    它返回一个Option,你必须解包,所以你可以假设所有好的值并使用apply

    nums(x) //Throws if key not found
    

    或者你可以使用默认值:

    nums.getOrElse(x, 0)
    

    【讨论】:

      【解决方案2】:

      您正在Map 上寻找apply 方法。回想一下,您只需添加括号即可调用apply

      nums('M') //returns 1000
      nums.apply('M') //equivalent in Scala
      

      如果您不确定Map 中的密钥是否可用,并且您希望避免应用程序抛出的异常,您也可以使用get 返回Option[Int]

      nums.get('M') //returns Some(1000)
      nums.get('K') //returns None
      nums('K') //throws an exception
      

      我还建议研究 Scala 中一些更惯用的范例(例如,使用 val)。对于您的示例,您可能会考虑这样的事情,它使用内部方法和值、稍微复杂的模式匹配、非常重要的 map 方法、映射中使用的隐式 apply 和递归:

      def convert(rm: String) = {
          val nums = Map('M' -> 1000, 'D' -> 500, 'C' -> 100, 'L' -> 50, 'X' -> 10, 'V' -> 5, 'I' -> 1)
          def calcRM(rm: Seq[Int]): Int = rm match {
              case x :: y :: tail if x < y => y - x + calcRM(tail)
              case x :: tail => x + calcRM(tail)
              case Nil => 0
          }
          calcRM(rm.map(nums).toList)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 1970-01-01
        相关资源
        最近更新 更多