gpt4 book ai didi

Scala:如何从 map 制作 Hash(Trie)Map(通过 Anorm in Play)

转载 作者:行者123 更新时间:2023-12-04 23:04:57 24 4
gpt4 key购买 nike

HashTrieMaps 上阅读了此报价在 docs.scala-lang.org :

For instance, to find a given key in a map, one first takes the hash code of the key. Then, the lowest 5 bits of the hash code are used to select the first subtree, followed by the next 5 bits and so on. The selection stops once all elements stored in a node have hash codes that differ from each other in the bits that are selected up to this level.



我认为这是一个很好的(阅读:快!)集合来存储我的 Map[String, Long] 。

在我的 Play 框架(使用 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 的实现)?

欢迎任何反馈。

最佳答案

正如您指向的文档所解释的那样,不可变映射已经在幕后实现为 HashTrieMap s。您可以在 REPL 中轻松验证这一点:

scala> println( Map(1->"one", 2->"two", 3->"three", 4->"four", 5->"five").getClass )
class scala.collection.immutable.HashMap$HashTrieMap

所以你没有什么特别的事情要做,你的代码已经在使用 HashMap.HashTrieMap你甚至没有意识到。

更准确地说, immutable.Map 的默认实现是 immutable.HashMap ,由 immutable.HashMap.HashTrieMap 进一步细化(扩展) .
请注意,小的不可变映射不是 immutable.HashMap.HashTrieMap 的实例。 ,但作为特殊情况实现(这是一种优化)。有一个特定的大小阈值,它们开始被执行为 immutable.HashMap.HashTrieMap .
例如,在 REPL 中输入以下内容:
val m0 = HashMap[Int,String]()
val m1 = m0 + (1 -> "one")
val m2 = m1 + (2 -> "two")
val m3 = m2 + (3 -> "three")
println(s"m0: ${m0.getClass.getSimpleName}, m1: ${m1.getClass.getSimpleName}, m2: ${m2.getClass.getSimpleName}, m3: ${m3.getClass.getSimpleName}")

将打印这个:
m0: EmptyHashMap$, m1: HashMap1, m2: HashTrieMap, m3: HashTrieMap

所以这里的空映射是 EmptyHashMap$ 的一个实例.添加一个元素会得到 HashMap1 ,并添加另一个元素最终给出 HashTrieMap .

最后,使用 withDefaultValue不会改变任何东西,如 withDefaultValue只会返回一个实例 Map.WithDefault至包装初始 map (仍将是 HashMap.HashTrieMap )。

关于Scala:如何从 map 制作 Hash(Trie)Map(通过 Anorm in Play),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14687042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com