【问题标题】:How to collect items in a list of maps in Scala如何在 Scala 中的地图列表中收集项目
【发布时间】:2013-09-07 19:38:03
【问题描述】:

如果我有一系列具有重复值的映射和如下所示的子映射:

val from = Seq(
    Map("aaa" -> Map("bbb" -> Map("ccc" -> List(1)))),
    Map("aaa" -> Map("bbb" -> Map("ddd" -> List("a","b")))),
    Map("aaa" -> Map("bbb" -> Map("eee" -> List(99,100)))),
    Map("aaa" -> Map("bbb" -> Map("ccc" -> List(2,3)))),
    Map("aaa" -> Map("bbb" -> Map("ddd" -> List("c","d")))),
    Map("aaa" -> Map("bbb" -> Map("eee" -> List(101,102)))),
    Map("aaa" -> Map("bbb" -> Map("ccc" -> Map("ddd" -> Map("eee" -> Map("fff" -> Map("ggg" -> List(true, false)))
    ))))))

Scala 将其转换为如下所示的整理结构的方法是什么:

val to = Seq(
    Map("aaa" ->
      Map("bbb" -> Map(
        "ccc" -> List(1, 2, 3),
        "ddd" -> List("a", "b", "c", "d"),
        "eee" -> List(99, 100, 101, 102),
        "fff" -> 
            Map("ggg" -> List(true, false))
      )
    )
  )
)

【问题讨论】:

  • 示例中给出的结构很奇怪,因为每个地图都只有一个条目(这使得地图过度杀伤,简单的配对就可以完成这项工作)。这是故意的吗?
  • 每个地图只有一个条目的原因是因为它代表了这些值的路径。目标是将序列中的所有值整理在一起,使路径分层。 (实际上每个节点可能有多个映射到它的值。)

标签: scala map collate


【解决方案1】:

这种结构称为Trie 或“前缀树”。 github 上有一个 gist (https://gist.github.com/timcowlishaw/1363652) 实现了这个概念。

更新

实际的转换算法必须(恕我直言)将嵌套映射转换回关键字符串。然后构建 Trie 就像将所有带有 put 的元素放在提供的 gist 中一样简单。所以我认为在程序中早一点使用这个结构会更好。

【讨论】:

  • 虽然这是一条有用的信息,但我认为它不能回答问题。您没有提供将 val from 转换为 Trie 的方法,无论是否惯用。链接的包也没有。因此,虽然这是一个很好的评论,但我认为它不能作为答案。
  • 嗯,我相信给事物起正确的名字可以极大地简化解决方案的查找。如果 OutNSpace 没有称它为 Trie,那么我猜他们还没有发现它。有了 OutNSpace 的概念,它不仅可以解决这个特定的问题,还可以重新思考这个问题,并在程序的早期使用 Trie 结构。
  • 如前所述,这很有用,但实际上并不能回答我的问题。 (而且这里不可能使用 Trie 结构)
  • 我认为TreeMap 本身的行为应该符合要求。
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多