【发布时间】:2015-10-16 13:48:15
【问题描述】:
在为 Scala 设计 JSON AST 时,我们意识到遇到了一个问题(可以在此处更详细地描述 https://github.com/json4s/json4s-ast/issues/8),理想情况下,我们希望用 Map 结构表示 JObject(JSON 对象)要么保留其键的顺序,要么使用默认的Ordering 按键排序,该默认Ordering 具有常量或有效常量查找时间。
我们需要保留顺序或保证键排序的东西的原因是,当有人序列化 JValue 时,我们需要确保它总是为相同的 JValue 输出相同的 JSON(最明显的情况是缓存 JValue 序列化)
问题在于 Scala 标准库似乎没有不可变的 Map 数据结构,该数据结构通过 O(c) 或 O(eC) 查找时间按键保留/排序(参考 http://docs.scala-lang.org/overviews/collections/performance-characteristics.html)
有谁知道在 Scala 集合库之后的某个地方是否存在这种数据结构的实现(或者即使这样的数据结构普遍存在)?
【问题讨论】:
-
有 SortedMap 但我找不到任何关于它的性能的信息。如果你真的没有找到任何东西,尽管你可以使用 HashMap 和将索引映射到键的 Array/HashMap 来制作自己的东西。
-
SortedMap 是一个抽象特征。它在 Scala 中的默认实现是
TreeMap,它具有日志查找(而不是 c/eC) -
为什么不想单独存储有序键序列?类似
(Seq[String], Map[String, AnyRef])。 -
主要是由于内存的原因,这是一个通用的 JSON AST 数据类型,它可以保存大量的 JSON 数据。另外,除非我弄错了,否则这意味着我们必须创建自己的集合来实现
ScalasortedMap 接口,因为我们希望用户将JObject中的type视为标准映射
标签: json scala data-structures immutability scala-collections