【问题标题】:Scala LinkedHashMap.toMap preserves order?Scala LinkedHashMap.toMap 保留顺序?
【发布时间】:2011-09-06 03:37:36
【问题描述】:

如标题所述,将 LinkedHashMap 转换为 Map 是否会保留元素的存储顺序?

我不相信,但找不到任何证据。

或者,在 Scala 中是否有任何不可变 Map 的实现保留元素插入的顺序?

【问题讨论】:

    标签: scala


    【解决方案1】:

    通用的Map 接口不保证这种排序。也不能,因为这会排除 HashMap 作为可能的实现。

    我相信collection.immutable.ListMap 保留了插入顺序,您也可以通过Map 接口使用LinkedHashMap,这将阻止访问任何mutator 方法。通过显式指定类型很容易做到这一点:

    val m: scala.collection.Map[Int,Int] = collection.mutable.LinkedHashMap(1->2, 2->3)
    

    或(使用类型归属):

    val m = collection.mutable.LinkedHashMap(1->2, 2->3) : Map[Int,Int]
    

    【讨论】:

    • 除非您的示例中的 Map 接口是 mutable.Map,否则这是行不通的。因此,我的问题是关于通过 toMap 方法将 LinkedHashMap 转换为不可变映射。
    • 它是一个scala.collection.Map,它是mutable.Mapimmutable.Map 的共同超类型
    【解决方案2】:

    不,LinkedHashMap.toMap 不保留插入顺序。

    我知道的最好方法是将其转换为 ListMap(不可变):

    def toMap[A, B](lhm: mutable.LinkedHashMap[A, B]): ListMap[A, B] = ListMap(lhm.toSeq: _*)
    

    简单地隐藏变异方法与转换为不可变对象不同。

    【讨论】:

    • +1 这实际上以与更流行的方式不同的方式回答了这个问题。它展示了如何将 LHM 转换为 LM - 我发现这很有用。
    • 列表图不是按倒序保存的吗? alvinalexander.com/scala/…
    • @AndrewNorman 你可以自己试试。 ListMap.apply 调用 ++= 不会颠倒顺序
    • 有趣的是,转换为可变 ListMap 不会保留顺序。有谁知道为什么?
    【解决方案3】:

    你可以使用TreeMap:

    TreeMap(Map(1 -> "one", 2 -> "two", 3 -> "three").toArray:_*).map(println)
    

    【讨论】:

    • TreeMap 是按顺序排序的,而不是按添加元素的顺序。
    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2012-03-08
    • 2017-06-18
    • 2012-05-31
    • 2014-01-21
    • 2014-12-01
    相关资源
    最近更新 更多