代码之家  ›  专栏  ›  技术社区  ›  ebruchez

scala映射实现是否按插入顺序保留条目?

  •  39
  • ebruchez  · 技术社区  · 14 年前

    在爪哇,我使用 LinkedHashMap 为此目的。Java的文档 链接达什图 很明显它有“可预测的迭代顺序”,我在scala中也需要相同的顺序。

    斯卡拉有 ListMap 链接达什图 但是他们所做的工作的文档却很糟糕。

    问题:斯卡拉的 链接达什图 列表映射 用于此目的的实现?如果不是,除了使用Java之外,还有什么其他的选择 链接达什图 直接?

    6 回复  |  直到 6 年前
        1
  •  46
  •   Randall Schulz    14 年前

    来自 LinkedHashMap scaladoc页面:

    • “此类使用哈希表实现可变映射。迭代器和 这个类的所有遍历方法都按元素的顺序访问它们 已插入。“
        2
  •  15
  •   Reid Spencer    11 年前

    两者的区别在于 LinkedHashMap 是可变的,而 ListMap 是不变的。否则他们都是 MapLike 并保留插入顺序。

        3
  •  6
  •   Michelle    7 年前

    对于Linkedhashmap,答案很明显,它保留了插入顺序。

    但对于listmap来说,这里似乎有些混乱。

    首先,有两个列表图。

    • scala.collection.mutable.listmap
    • scala.collection.immutable.listmap。

    第二,据我所知,listmap的文档有问题。

    mutable.ListMap

    实际顺序不是它所说的插入顺序。

    它也不是插入的逆顺序。我尝试的结果是[第四,第二,第一,第三]

    由列表支持的简单可变映射,因此它保留插入顺序。

    immutable.ListMap

    如文档所述,顺序是插入顺序。

    需要注意的一点是,它是以相反的插入顺序存储在内部的。内部存储顺序和iterable/traversal顺序是两件事。内部存储顺序决定查找方法(如head/last/tail/init/)的时间复杂性。

    此类使用基于列表的数据结构实现不可变映射。列表映射迭代器和遍历方法按插入乳清的顺序访问键值对。

    条目以相反的插入顺序存储在内部,这意味着最新的键位于列表的顶部。

        4
  •  3
  •   Andrew Norman    7 年前
    • LinkedHashMap的添加顺序
    • (不可变)listmap的添加顺序是向后的(即最后一个添加的是第一个)

    LinkedHashMap仅作为可变映射实现 列表映射在可变和不可变的包中实现,但是只有不可变的列表映射保持向后的顺序。(可变列表映射不维护顺序)

        5
  •  2
  •   Nandakishore    8 年前

    ListMap 不保留插入顺序。

    enter image description here

    只有 LinkedHashMap 保持元素插入方式的顺序。

    enter image description here

    如果您想在地图以外的列表中维护顺序,可以使用 LinkedList

    enter image description here

        6
  •  0
  •   ebruchez    6 年前

    scala 2.13引入了 Map 保持插入顺序: VectorMap SeqMap . 看看这个 PR :

    目前还没有任何已知的不变映射能够在保持键的有效查找时间不变的情况下保持键插入顺序,因此,唯一已知的实现是通过将向量与hasmap(或scala的hashmap/champhashmap)组合来完成的。

    截至目前,scala 2.13仍计划于2018年发布。