web-dev-qa-db-ja.com

Scalaエントリを挿入順に保持するマップ実装?

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

ScalaにはListMapLinkedHashMapがありますが、それらが正確に何をするかに関するドキュメントは不十分です。

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

39
ebruchez

LinkedHashMap Scaladocページから:

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

2つの違いは、LinkedHashMapは変更可能であるのに対し、ListMapは不変です。それ以外の場合、どちらもMapLikeであり、挿入順序も保持されます。

16
Reid Spencer

LinkedHashMapの場合、挿入の順序が維持されることは明らかです。

しかし、ListMapについては、ここに混乱があるようです。

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

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

次に、私が試した限りでは、ListMapのドキュメントに問題があります。

mutable.ListMap

実際の順序は、言うように挿入順序ではありません。

また、挿入の順序も逆ではありません。私が試した結果は[フォース、セカンド、ファースト、サード]です

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

immutable.ListMap

と書いてあるとおり、順番は挿入順です

注目すべきことの1つは、逆に挿入された順序で内部的に格納されていることです。そして、内部に保存された順序と反復可能/トラバーサルの順序が2つあります。内部に格納された順序は、head/last/tail/init /などのルックアップメソッドの時間の複雑さを決定します。

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

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

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

LinkedHashmapは、変更可能なマップとしてのみ実装されます。ListMapsは、変更可能なパッケージと不変のパッケージの両方で実装されますが、不変のListMapのみが逆順を維持します。 (可変リストマップは順序を維持しません)

3
Andrew Norman

Scala 2.13では、挿入順序を維持するMapの2つの新しい不変の実装、VectorMapSeqMapが導入されています。これを見る [〜#〜] pr [〜#〜] : "

現在、キーのルックアップ時間を事実上一定に保ちながらキーの挿入順序を維持する既知の不変マップはありません。そのため、既知の実装のみが、VectorとHasMap(またはScalaの場合はHashMap/ChampHashMap)を組み合わせて行われます。

執筆時点では、Scala 2.13は2018年にリリースされる予定です。

1
ebruchez

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

enter image description here

要素の順序を維持するのは、LinkedHashMapだけです。

enter image description here

マップ以外のリストで順序を維持したい場合は、LinkedListを使用できます

enter image description here

1
Nandakishore