Implementación de Scala Map manteniendo las entradas en orden de inserción?

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?

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”.

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.

mutable.ListMap

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.

inmutable.ListMap

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)

ListMap no conserva el orden de inserción.

enter image description here

Solo LinkedHashMap mantiene el orden de los elementos tal como están insertados.

enter image description here

Si desea mantener el orden en Listas distintas a Map, puede usar LinkedList

enter image description here

Scala 2.13 presenta dos nuevas implementaciones inmutables de Map que mantienen el orden de inserción: VectorMap y SeqMap . Ver este PR : ”

Actualmente no existe ningún mapa inmutable conocido que también mantenga el orden de inserción de claves mientras mantiene efectivamente el tiempo de búsqueda constante en la clave, por lo que las únicas implementaciones conocidas se realizan combinando un vector con un mapa hash (o en el caso de Scala HashMap / ChampHashMap)

Al momento de escribir, Scala 2.13 todavía está progtwigdo para ser lanzado en 2018.

Intereting Posts