5

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 )
}

このコードはdatatype で構成されて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) に変換する方法です。

どんなフィードバックでも大歓迎です。

4

1 に答える 1