【发布时间】:2011-09-06 03:37:36
【问题描述】:
如标题所述,将 LinkedHashMap 转换为 Map 是否会保留元素的存储顺序?
我不相信,但找不到任何证据。
或者,在 Scala 中是否有任何不可变 Map 的实现保留元素插入的顺序?
【问题讨论】:
标签: scala
如标题所述,将 LinkedHashMap 转换为 Map 是否会保留元素的存储顺序?
我不相信,但找不到任何证据。
或者,在 Scala 中是否有任何不可变 Map 的实现保留元素插入的顺序?
【问题讨论】:
标签: scala
通用的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]
【讨论】:
scala.collection.Map,它是mutable.Map 和immutable.Map 的共同超类型
不,LinkedHashMap.toMap 不保留插入顺序。
我知道的最好方法是将其转换为 ListMap(不可变):
def toMap[A, B](lhm: mutable.LinkedHashMap[A, B]): ListMap[A, B] = ListMap(lhm.toSeq: _*)
简单地隐藏变异方法与转换为不可变对象不同。
【讨论】:
ListMap.apply 调用 ++= 不会颠倒顺序
你可以使用TreeMap:
TreeMap(Map(1 -> "one", 2 -> "two", 3 -> "three").toArray:_*).map(println)
【讨论】:
TreeMap 是按顺序排序的,而不是按添加元素的顺序。