it-swarm.com.de

Implementierung der Scala-Karte, bei der die Einträge in der Reihenfolge der Einfügung bleiben?

In Java verwende ich zu diesem Zweck LinkedHashMap. Die Dokumentation von Javas LinkedHashMap ist sehr klar, dass es eine "vorhersagbare Iterationsreihenfolge" hat und ich brauche dasselbe in Scala.

Scala hat ListMap und LinkedHashMap, aber die Dokumentation darüber, was genau sie tun, ist schlecht.

Frage: Ist Scalas LinkedHashMap oder ListMap die Implementierung, die für diesen Zweck verwendet werden soll? Wenn nicht, welche anderen Optionen gibt es neben der direkten Verwendung der LinkedHashMap von Java?

38
ebruchez

Von der LinkedHashMap Scaladoc Seite:

  • "Diese Klasse implementiert veränderbare Maps unter Verwendung einer Hash-Tabelle. Der Iterator und alle Traversal-Methoden dieser Klasse besuchen Elemente in der Reihenfolge, in der sie eingefügt wurden."
45
Randall Schulz

Der Unterschied zwischen den beiden besteht darin, dass LinkedHashMap veränderlich ist, während ListMap unveränderlich ist. Andernfalls sind beide MapLike und behalten auch die Einfügereihenfolge bei.

14
Reid Spencer

Für LinkedHashMap ist die Antwort ziemlich eindeutig, dass die Reihenfolge des Einfügens beibehalten wird.

Aber für ListMap scheint es hier einige Verwirrungen zu geben.

Erstens gibt es zwei ListMap.

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

Zweitens hat das Dokument für ListMap meines Erachtens etwas falsches.

mutable.ListMap

Die tatsächliche Reihenfolge ist nicht die Einfügereihenfolge, wie es heißt.

Und es ist auch nicht die umgekehrte Reihenfolge der Einfügung. Das Ergebnis, das ich versucht habe, ist [vierter, zweiter, erster, dritter]

Eine einfache veränderbare Karte, die mit einer Liste hinterlegt ist, sodass die Reihenfolge der Einfügungen erhalten bleibt.

unveränderlich.ListMap

Wie das Dokument sagt, ist die Reihenfolge die Einfügereihenfolge.

Zu beachten ist, dass es intern in umgekehrter Reihenfolge gespeichert wird. Und die intern gespeicherte Reihenfolge und die iterable/Traversal-Reihenfolge sind zwei Dinge. Die intern gespeicherte Reihenfolge entscheidet über die zeitliche Komplexität von Suchmethoden wie head/last/tail/init /.

Diese Klasse implementiert unveränderliche Maps mithilfe einer listenbasierten Datenstruktur. Listen-Karten-Iteratoren und Traversal-Methoden besuchen Schlüssel-Wert-Paare in der Reihenfolge, in der sie zum ersten Mal eingefügt wurden.

Einträge werden intern in umgekehrter Reihenfolge gespeichert, dh der neueste Schlüssel steht am Anfang der Liste.

5
Michelle
  • LinkedHashmap befindet sich in der Reihenfolge, in der es hinzugefügt wurde
  • (unveränderlich) ListMap befindet sich in der umgekehrten Reihenfolge, in der es hinzugefügt wurde (d. h. die zuletzt hinzugefügte ist die erste).

LinkedHashmap ist nur als veränderbare Map implementiert. ListMaps sind sowohl in veränderbaren als auch in unveränderbaren Paketen implementiert. Die umgekehrte Reihenfolge wird jedoch nur in unveränderbaren ListMaps beibehalten. (veränderbare Listmaps behalten keine Reihenfolge bei)

3
Andrew Norman

ListMap behält die Reihenfolge der Einfügung nicht bei.

 enter image description here

Nur LinkedHashMap behält die Reihenfolge der Elemente bei, wie sie eingefügt werden.

 enter image description here

Wenn Sie die Reihenfolge in anderen Listen als der Karte beibehalten möchten, können Sie LinkedList verwenden.

 enter image description here

2
Nandakishore

Scala 2.13 führt zwei neue unveränderliche Implementierungen von Map ein, bei denen die Einfügereihenfolge beibehalten wird: VectorMap und SeqMap. Siehe hierzu PR : "

Derzeit ist keine unveränderliche Karte bekannt, die auch die Reihenfolge der Schlüsseleinfügung beibehält, während die Nachschlagezeit auf dem Schlüssel konstant bleibt. Daher werden die einzigen bekannten Implementierungen durch Kombinieren eines Vektors mit einer HasMap (oder in Scalas Fall HashMap/ChampHashMap) durchgeführt.

Zum jetzigen Zeitpunkt soll Scala 2.13 noch im Jahr 2018 veröffentlicht werden.

0
ebruchez