如何使用第一个地图的值检索嵌套地图的值?

jja*_*394 3 algorithm functional-programming scala hashmap pattern-matching

我有一个Map [String,String]类型的条目映射和一个Map [String,Map [String,String]]类型的查找映射。我的目标是在第一张地图中查找第二张地图中的匹配项,一旦有了键匹配项,我就必须用查找第二张字典来替换第一张字典中的值。该示例将清除所有问题。

到目前为止,我已经提出了一种算法,但是我得到了Some(e)和Some(t)的一个奇怪答案。

第一个条目映射如下:

val entries = Map("fruit" -> "aaa", "animal" -> "bbb", "person" -> "jjj")
Run Code Online (Sandbox Code Playgroud)

第二张地图如下:

val lookup = Map("fruit" -> Map("ccc" -> "orange", "aaa" -> "apple"),
                 "animal" -> Map("zzz" -> "dog", "bbb" -> "cat"))
Run Code Online (Sandbox Code Playgroud)

我期望的结果如下(注意:由于没有匹配项,因此“ person”未正确包含在结果中):

val result = Map("fruit" -> "apple", "animal" -> "cat")
Run Code Online (Sandbox Code Playgroud)

我想出的算法如下:

val res = for{ (k, ev) <- entries 
      lv <- lookup.get(k).get(ev)} yield (k, lv)
Run Code Online (Sandbox Code Playgroud)

这个算法给我以下结果,我不知道为什么:

Map(fruit -> e, animal -> t)
Run Code Online (Sandbox Code Playgroud)

e和t来自哪里?

jwv*_*wvh 5

将其分解为各个组成部分。

for {
  (k,v1) <- entries
  submap <- lookup.get(k)
  v2     <- submap.get(v1)
} yield (k,v2)
//res0: immutable.Map[String,String] = Map(fruit -> apple, animal -> cat)
Run Code Online (Sandbox Code Playgroud)

不知道eand t在错误输出中来自何处。


好,我知道了。lv <- lookup.get(k).get(ev)通过的每一个字母迭代"apple""cat"分别,但作为只能有一个键- >值对用于在每个键Map中,只有最后一个字母被保留。

  • lookup.get(k)返回一个Option [Map [String,String]`。如果`Option`为`None`,则下面的`.get(ev)`将引发异常。如果`Option`是`Some(m)`,那么`.get()`将对其展开,并将`ev`的值应用于它。换句话说,将`ev`的值提供给未包装的`Map`作为检索相关值的关键字,该值是一个发送给生成器的String类型,它会处理该生成器(&lt;-`部分)作为要迭代并分配给lv的一系列Char值。 (2认同)