2010-10-01 10 views
31

En Java, utilizo LinkedHashMap para este propósito. La documentación de Java LinkedHashMap es muy clara de que tiene "orden de iteración predecible" y necesito lo mismo en Scala.Implementación de Scala Map manteniendo las entradas en orden de inserción?

Scala tiene ListMap y LinkedHashMap, pero la documentación sobre lo que hacen exactamente es mala.

Pregunta: ¿La implementación de Scala es LinkedHashMap o ListMap para este fin? Si no, ¿qué otras opciones están disponibles además de usar el LinkedHashMap de Java directamente?

+2

solo para tener en cuenta, no recomiendo usar las clases de ListMap de scala en general. Tienen complejidad de tiempo lineal para la mayoría de las operaciones. Entonces, a menos que su mapa sea pequeño, la lógica que usa los mapas de lista realmente se arrastrará. http://docs.scala-lang.org/overviews/collections/performance-characteristics.html –

Respuesta

38

Desde la página LinkedHashMap Scaladoc:

  • "Esta clase implementa mapas mutables utilizando una tabla hash El iterador y todos los métodos de recorrido de esta visita a la clase de elementos en el orden en que fueron insertados .".
+0

Ah, parece que no puedo leer el documento correctamente. ¡Gracias! – ebruchez

13

La diferencia entre los dos es que LinkedHashMap es mutable, mientras que ListMap es inmutable. De lo contrario, ambos son MapLike y también conservan el orden de inserción.

+2

Hay ListMap inmutable y ListMap mutable. – Michelle

+0

otra diferencia es que 'ListMap' tiene [complejidad lineal en la búsqueda y la inserción] (https://docs.scala-lang.org/overviews/collections/performance-characteristics.html) –

3
  • LinkedHashMap está en el orden en que se añadió
  • (inmutable) ListaMapa está en el orden hacia atrás se añadió (es decir, el último añadido es primero)

LinkedHashMap solamente se implementa como una mapa mutable Los ListMaps se implementan en los paquetes mutables e inmutables, sin embargo, solo los ListMaps inmutables mantienen el orden inverso. (los mapas de lista mutables no mantienen el orden)

+0

este es un buen artículo que analiza el varias implementaciones de mapas en scala http://alvinalexander.com/scala/how-to-choose-map-implementation-class-sorted-scala-cookbook –

+0

ListMap ni siquiera mantiene el orden en orden inverso como usted dice. Se muestra al azar de la lista. – Nandakishore

+1

En realidad, el documento de scala api es incorrecto. Y es diferente entre inmutable.ListMap y mutable.ListMap – Michelle

2

ListMap no conserva el orden de inserción.

enter image description here

Sólo LinkedHashMap mantiene el orden de los elementos de la forma en que se insertan.

enter image description here

Si desea mantener el orden en las listas otherthan Mapa puede utilizar LinkedList

enter image description here

+0

está evaluando mapas de lista mutables, pero la mayoría de la gente usa los mapas de lista inmutables, que es una implementación completamente diferente –

4

Para LinkedHashMap, la respuesta es bastante claro que conserva el orden de inserción.

Pero para ListMap, parece que hay algunos problemas aquí.

En primer lugar, hay dos ListMap.

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

En segundo lugar, el documento de ListMap tiene algo mal por lo que he intentado.

mutable.ListMap

El orden real no es el orden de inserción como se dice.

Y tampoco es el orden inverso de inserción. El resultado que probé es [adelante, segundo, primero, tercero]

Un mapa mutable simple respaldado por una lista, por lo que conserva el orden de inserción.

immutable.ListMap

Como el documento diciendo que, el orden es el orden de inserción.

Una cosa a tener en cuenta es que se almacena internamente en orden de inserción invertido. Y el orden almacenado internamente y el orden iterable/transversal son dos cosas. El orden almacenado internamente decide la complejidad del tiempo de los métodos de búsqueda como head/last/tail/init /.

Esta clase implementa mapas inmutables utilizando una estructura de datos basada en listas. Los iteradores de mapa de lista y los métodos de recorrido cruzan pares clave-valor en el orden en que primero se insertaron suero.

Las entradas se almacenan internamente en orden de inserción invertido, lo que significa que la última clave está al principio de la lista.

Cuestiones relacionadas