Javaでは、この目的のためにLinkedHashMap
を使用します。 JavaのLinkedHashMap
のドキュメントには、「予測可能な反復順序」があることが非常に明確であり、Scalaでも同じことが必要です。
ScalaにはListMap
とLinkedHashMap
がありますが、それらが正確に何をするかに関するドキュメントは不十分です。
質問:ScalaのLinkedHashMap
またはListMap
は、この目的で使用する実装ですか?そうでない場合、JavaのLinkedHashMap
を直接使用する以外にどのようなオプションを利用できますか?
LinkedHashMap
Scaladocページから:
2つの違いは、LinkedHashMap
は変更可能であるのに対し、ListMap
は不変です。それ以外の場合、どちらもMapLike
であり、挿入順序も保持されます。
LinkedHashMapの場合、挿入の順序が維持されることは明らかです。
しかし、ListMapについては、ここに混乱があるようです。
まず、2つのListMapがあります。
次に、私が試した限りでは、ListMapのドキュメントに問題があります。
実際の順序は、言うように挿入順序ではありません。
また、挿入の順序も逆ではありません。私が試した結果は[フォース、セカンド、ファースト、サード]です
リストに裏打ちされた単純な変更可能なマップなので、挿入順序が保持されます。
と書いてあるとおり、順番は挿入順です
注目すべきことの1つは、逆に挿入された順序で内部的に格納されていることです。そして、内部に保存された順序と反復可能/トラバーサルの順序が2つあります。内部に格納された順序は、head/last/tail/init /などのルックアップメソッドの時間の複雑さを決定します。
このクラスは、リストベースのデータ構造を使用して不変マップを実装します。リストマップの反復子とトラバーサルメソッドは、ホエイが最初に挿入された順序でキーと値のペアにアクセスします。
エントリは内部的に逆の挿入順序で保存されます。つまり、最新のキーがリストの先頭にあります。
LinkedHashmapは、変更可能なマップとしてのみ実装されます。ListMapsは、変更可能なパッケージと不変のパッケージの両方で実装されますが、不変のListMapのみが逆順を維持します。 (可変リストマップは順序を維持しません)
Scala 2.13では、挿入順序を維持するMap
の2つの新しい不変の実装、VectorMap
とSeqMap
が導入されています。これを見る [〜#〜] pr [〜#〜] : "
現在、キーのルックアップ時間を事実上一定に保ちながらキーの挿入順序を維持する既知の不変マップはありません。そのため、既知の実装のみが、VectorとHasMap(またはScalaの場合はHashMap/ChampHashMap)を組み合わせて行われます。
執筆時点では、Scala 2.13は2018年にリリースされる予定です。