docs.scala-lang.org のHashTrieMapsに関するこの引用を読んだ後:
たとえば、マップ内の特定のキーを見つけるには、まずキーのハッシュ コードを取得します。次に、ハッシュ コードの最下位 5 ビットを使用して最初のサブツリーを選択し、その後に次の 5 ビットを選択します。ノードに格納されているすべての要素が、このレベルまで選択されたビットで互いに異なるハッシュ コードを持つと、選択は停止します。
Map[String, Long] を格納するための優れた (読み取り: 高速!) コレクションであると考えました。
私の Play フレームワーク (Scala を使用) には、約 18k の要素をロードする Anorm を使用したこのコードがあります。読み込みには数秒かかります (大したことではありませんが、ヒントはありますか?)。文字列から長い翻訳への高速検索のために、「メモリ内」に置きたいと思います。
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
type で構成されて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 (または HashTrieMap の実装を共有している場合は HashMap) に変換する方法です。
どんなフィードバックでも大歓迎です。