在docs.scala-lang.org上阅读HashTrieMaps上的这句话后:
例如,要在地图中找到给定的键,首先要获取该键的哈希码。然后,哈希码的最低 5 位用于选择第一个子树,然后是接下来的 5 位,以此类推。一旦存储在节点中的所有元素的哈希码在此级别之前选择的位中彼此不同,选择就会停止。
我认为这是一个很棒的(阅读:快!)集合来存储我的 Map[String, Long]。
在我的 Play Framework(使用 Scala)中,我使用 Anorm 加载了大约 18k 个元素的这段代码。加载需要几秒钟(没什么大不了的,但有什么提示吗?)。我想把它放在“内存中”,以便快速查找字符串到长翻译。
val data = DB.withConnection { implicit c ⇒
SQL( "SELECT stringType, longType FROM table ORDER BY stringType;" )
.as( get[String]( "stringType" ) ~ get[Long]( "longType " )
map { case ( s ~ l ) ⇒ s -> l }* ).toMap.withDefaultValue( -1L )
}
此代码data
的类型为class scala.collection.immutable.Map$WithDefault
. 我希望这是一种类型HashTrieMap
(或者HashMap
,据我所知,链接引用的所有 Scala HashMap 都属于 HashTrieMap?)。奇怪的是,我找不到如何将其转换为 HashTrieMap 的方法。(我是 Scala、Play 和 Anorm 的新手。)
// Test for the repl (2.9.1.final). Map[String, Long]:
val data = Map( "Hello" -> 1L, "world" -> 2L ).withDefaultValue ( -1L )
data: scala.collection.immutable.Map[java.lang.String,Long] =
Map(Hello -> 1, world -> 2)
// Google showed me this, but it is still a Map[String, Long].
val hm = scala.collection.immutable.HashMap( data.toArray: _* ).withDefaultValue( -1L )
// This generates an error.
val htm = scala.collection.immutable.HashTrieMap( data.toArray: _* ).withDefaultValue( -1L )
所以我的问题是如何将 MapWithDefault 转换为 HashTrieMap(或 HashMap,如果它共享 HashTrieMap 的实现)?
欢迎任何反馈。