質問

Javaでは、私は、 LinkedHashMap この目的のために。Java のドキュメント LinkedHashMap 「予測可能な反復順序」があることは非常に明らかであり、Scala でも同じものが必要です。

Scala には ListMap そして LinkedHashMap, 、しかし、それらが正確に何をするかについてのドキュメントは貧弱です。

質問:スカラのものですか LinkedHashMap または ListMap この目的に使用する実装は?そうでない場合、Java の使用以外にどのようなオプションが利用可能ですか? LinkedHashMap 直接?

役に立ちましたか?

解決

から LinkedHashMap Scaladoc ページ:

  • 「このクラスは、ハッシュテーブルを使用して可変マップを実装します。このクラスのイテレーターとすべてのトラバーサル方法は、挿入された順序で要素を訪問します。」

他のヒント

は2つの違いはLinkedHashMapは不変であるListMapが可変であることです。そうでなければ、彼らは両方ともMapLikeであり、また挿入順序を保持します。

LinkedHashMap の場合、挿入順序が保持されるという答えは明らかです。

しかし、ListMap の場合、ここでいくつかの混乱があるようです。

まず、ListMap が 2 つあります。

  • scala.collection.mutable.ListMap
  • scala.collection.immutable.ListMap。

次に、ListMap のドキュメントには、私が試した限りでは何か間違っています。

mutable.ListMap

実際の注文は、文字通りの広告掲載オーダーではありません。

また、挿入順序が逆ではありません。試した結果は[4番目、2番目、1番目、3番目]です

リストに基づいた単純な変更可能なマップなので、挿入順序が保持されます。

immutable.ListMap

という文書の通り、順番は掲載順です。

注意すべき点の 1 つは、内部的には逆の挿入順序で保存されていることです。そして、内部的に保存される順序と反復可能/走査順序は 2 つのものです。内部的に保存された順序によって、head/last/tail/init/ などの検索メソッドの時間計算量が決まります。

このクラスは、リストベースのデータ構造を使用して不変マップを実装します。リスト マップ イテレータとトラバーサル メソッドは、最初に挿入された順序でキーと値のペアを訪問します。

エントリは内部的に逆の挿入順序で保存されます。つまり、最新のキーがリストの先頭になります。

  • LinkedHashmap は追加された順序です
  • (不変) ListMap は追加されたときと逆の順序になります (つまり、最後に追加されたものが最初になります)

LinkedHashmapは、可変マップリストマップが可変パッケージと不変の両方のパッケージの両方に実装されるためにのみ実装されていますが、不変のリストマップのみが後方順序を維持します。(可変リストマップは順序を維持しません)

ListMap挿入の順序を保持しません。

のみLinkedHashMapは、要素の順序、それらが挿入されている方法を維持します。

あなたは地図otherthanリストの順番を維持したい場合は、

あなたはLinkedList

を使用することができます

MapVectorMap

スカラ2.13オーダーを保つSeqMapの二つの新しい不変の実装を導入します。 "

:この PR を参照してください。
  

唯一の既知の実装はHasMap有するベクトルを組み合わせることによって行われるように現在キーに事実上一定のルックアップ時間を維持しながらも、キー挿入順序を維持する任意の既知の不変マップは、存在しない(またはScalaの場合のHashMap / ChampHashMapで)

書き込みの

として、Scalaの2.13は、まだ2018年にリリースされる予定です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top