【问题标题】:Creating a Map from Tuples in Scala在 Scala 中从元组创建映射
【发布时间】:2014-06-28 07:33:40
【问题描述】:

我是函数式编程语言的新手,需要帮助解决我的一个问题。

我需要在两个序列元组之间创建一个映射:

A = tuple1(tuple1(tuple1(x,y),z),a)

B = tuple2(tuple2(tuple2(1,2),3),4)

现在我需要类似下面的东西:

C = ((x,1),(y,2),(z,3),(a,4)) 如果我搜索说 x 那么我需要得到 1 ;

元组出现的次数未知,但两个元组结构相似。我无法理解和映射stackoverflow中类似问题的解决方案。所以有解释的解决方案会很有帮助

【问题讨论】:

  • 我认为正确的解决方案是首先避免创建这样的嵌套元组结构。他们不容易相处。改为创建列表,您可以使用 ziptoMap 来获得您想要的。
  • 你能解释一下你想要达到的目标吗?使用嵌套元组(甚至嵌套列表)是否必不可少?
  • 这对我来说是必要的,现在可能无法更改结构。我正在设计编译器,这是我的解释器设计所必需的。其中我需要跟踪函数参数,即传递的值的 id。解释整体结构可能有点复杂。
  • 如果您正处于编译器的设计阶段,那么您可以(并且可能应该)更改它。从 id name 到 value 的映射使用元组是合理的,但嵌套元组似乎是一种设计气味
  • 感谢各位帮忙。特别是@Jasper-M 解决方案很有用。我做了一些修改以适应我的需要。正如你们中的一些人所建议的那样改变并不容易,因为我需要努力与 Parser 一起改变检查器阶段。现在我意识到我应该如何考虑 Parser。

标签: scala functional-programming


【解决方案1】:

我认为这是(丑陋的)伎俩。

def toMap(x: (Any,String), y: (Any,Int)): Map[String, Int] = {
  @tailrec
  def rec(x: (Any,String), y: (Any,Int), map: Map[String, Int]): Map[String, Int] =
    x match {
      case (a: String, b) => 
        val (c: Int, d) = y
        map ++ Map(a -> c, b -> d)
      case (a: (Any,String), b) => 
        val (c: (Any,Int), d) = y
        rec(a, c, map ++ Map(b -> d))
    }
  rec(x, y, Map.empty[String, Int])
}

假设你想这样使用它:

scala> val a = ((("x","y"),"z"),"a")
a: (((String, String), String), String) = (((x,y),z),a)

scala> val b = (((1,2),3),4)
b: (((Int, Int), Int), Int) = (((1,2),3),4)

scala> toMap(a,b)
res1: Map[String,Int] = Map(a -> 4, z -> 3, x -> 1, y -> 2)

【讨论】:

    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 2016-04-12
    • 2013-01-13
    • 2019-11-20
    • 2011-10-13
    • 2019-10-27
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多