initialize - Implementación de Scala Map manteniendo las entradas en orden de inserción?
scala map function (5)
Desde la página de LinkedHashMap
Scaladoc:
- "Esta clase implementa mapas mutables usando una tabla hash. El iterador y todos los métodos transversales de esta clase visitan los elementos en el orden en que se insertaron".
En Java, utilizo LinkedHashMap
para este propósito. La documentación de LinkedHashMap
de Java es muy clara de que tiene "orden de iteración predecible" y necesito lo mismo en Scala.
Scala tiene ListMap
y LinkedHashMap
, pero la documentación sobre lo que hacen exactamente es pobre.
Pregunta: ¿ LinkedHashMap
o LinkedHashMap
de Scala son la implementación a usar para este propósito? Si no, ¿qué otras opciones están disponibles además de usar LinkedHashMap
de Java directamente?
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.
Para LinkedHashMap, la respuesta es bastante clara: conserva el orden de inserción.
Pero para ListMap, parece que hay algunos confusos 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.
El orden real no es el orden de inserción como 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.
Como dice el documento que, la orden es la orden de inserción.
Una cosa para notar 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 usando 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 clave más nueva está al principio de la lista.
- LinkedHashmap está en el orden en que se agregó
- (inmutable) ListMap está en el orden inverso al que se agregó (es decir, el último añadido es el primero)
LinkedHashmap solo se implementa como un 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)