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来自哪里?
将其分解为各个组成部分。
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中,只有最后一个字母被保留。