algorithm - 如何使用第一个 map 的值检索嵌套 map 的值?

标签 algorithm scala functional-programming hashmap pattern-matching

我有一个 Map[String, String] 类型的条目映射和一个 Map[String, Map[String, String]] 类型的查找映射。我的目标是在第一张 map 中查找第二张 map 中的匹配项,一旦我找到关键匹配项,我就必须将第一张字典中的值替换为第二张字典中的查找值。这个例子会把事情弄清楚。

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

第一个入口图如下:

val entries = Map("fruit" -> "aaa", "animal" -> "bbb", "person" -> "jjj")

第二张 map 如下:

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

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

val result = Map("fruit" -> "apple", "animal" -> "cat")

我想出的算法如下:

val res = for{ (k, ev) <- entries 
      lv <- lookup.get(k).get(ev)} yield (k, lv)

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

Map(fruit -> e, animal -> t)

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)

不确定 e 在哪里和 t来自您的错误输出。


好的,我明白了。 lv <- lookup.get(k).get(ev)正在遍历 "apple" 的每个字母和 "cat"分别,但是因为 Map 中的每个键只能有一个键->值对, 只保留最后一个字母。

关于algorithm - 如何使用第一个 map 的值检索嵌套 map 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56846170/

相关文章:

arrays - 如何计算最接近中位数的 k 个数字?

algorithm - CouchDB - 带排名的分层评论。黑客新闻风格

algorithm - 在 O(n) 或 O(n log n) 中查找回文子串的数量?

scala - 如何从 Play 中的每个请求记录正文?

functional-programming - Clojure 中的延续

functional-programming - "Stack overflow during evaluation"与 stdlib List.map

function - Haskell 中的组合函数

algorithm - 将整数数组编码为短字符串

class - 定义类 : difference between var, val 并忽略它?

java - Java 代码的等效 Scala 代码不起作用(方法签名无效)