我正在尝试编写两个映射,并在Scala中获得一个组合映射。我所做的工作如下:
val m1=Map(1->'A',2->'C',3->'Z')
val m2=Map('A' -> "Andy", 'Z'->"Zee",'D'->"David")
val m3=m2.compose(m1)现在m3是m1;m2,但它的类型是Function1。
问题:如何将Function1转换为Map?
ps。这里,而不是m2.Composed(M1),建议使用val m3 = m1 andThen m2。无论如何,结果是Function1类型。
发布于 2015-06-25 16:25:10
对于不存在的密钥,您会使用什么?如果yuo希望从map中删除此值,请使用
val m1: Map[Int, Char] = Map(1 -> 'A', 2 -> 'C', 3 -> 'Z')
val m2: Map[Char, String] = Map('A' -> "Andy", 'Z' -> "Zee", 'D' -> "David")
val m3: Map[Int, String] = m1.filter(x => m2.contains(x._2)).map(x => x._1 -> m2(x._2))
//Map(1 -> Andy, 3 -> Zee)跳过.filter(x => m2.include(x._2)),并在这种情况下抛出异常
发布于 2015-06-25 22:08:50
你也可以
val m3: Map[Int, String] = m1.mapValues(m2)请注意,尽管存在返回类型,但这将在每次访问m3(x)时重新计算m3(x),就像m2.compose(m1)一样。
由于我更新了问题的标题,所以现在的答案并不直接涉及问题的主题。我将拭目以待,看看是否有人可能提供一个直接的答案(即,如何将Function1转换为映射)。
def funToMap[A, B](f: A => B): Map[A, B] = Map.empty[A, B].withDefault(f)发布于 2015-06-26 01:55:16
为什么编写两个地图会给你一个Function1
Map提供了Function1的语义,然后提供了一些语义。当您组合两个Map函数时,您将得到一个新的Function1,因为compose是对函数的操作。
因此,您不应该期望通过编写两个Map s来获得Map --您只是在合成Map的功能方面,而不是Map本身。
如何获得一个组合地图
要将两个Map实际组合成另一个Map,可以使用mapValues,但要小心。如果你这样做:
val m3 = m1 mapValues m2您将得到一个视图(请参阅这只虫子),而不是一个简单的映射,因此在m3中进行查找时,它将真正在m1中进行查找,然后在m2中进行查找。对于大型的Map和很少的查找,这是一个胜利,因为你没有处理很多你不需要处理的条目。但是如果您做了大量的查找,这可能会导致严重的性能问题。
要真正创建一个表示m1和m2组合的新的单一m1数据结构,您需要执行以下操作
val m3 = (m1 mapValues m2).view.force这有点不幸。在一个完美的世界中,m1 mapValues m2会给你新的单曲组合Map --而且很快,通过创建一个形状与m1相同但值通过m2运行的新数据结构-- (m1 mapValues m2).view会给您视图(类型将反映这一点)。
https://stackoverflow.com/questions/31055389
复制相似问题