LinkedHashMap
se utiliza para conservar el orden de inserción en el mapa, pero esto solo funciona para mapas mutables. ¿Cuál es la implementación inmutable de Map
que preserva el orden de inserción?Implementación inamovible de Scala Map que conserva el orden de inserción
Respuesta
ListMap implementa un mapa inmutable utilizando una estructura de datos basada en listas, y así conserva el orden de inserción.
scala> import collection.immutable.ListMap
import collection.immutable.ListMap
scala> ListMap(1 -> 2) + (3 -> 4)
res31: scala.collection.immutable.ListMap[Int,Int] = Map(1 -> 2, 3 -> 4)
scala> res31 + (6 -> 9)
res32: scala.collection.immutable.ListMap[Int,Int] = Map(1 -> 2, 3 -> 4, 6 -> 9)
El siguiente método de extensión - Seq#toListMap
pueden ser muy útiles cuando se trabaja con ListMap
s.
scala> import scalaz._, Scalaz._, Liskov._
import scalaz._
import Scalaz._
import Liskov._
scala> :paste
// Entering paste mode (ctrl-D to finish)
implicit def seqW[A](xs: Seq[A]) = new SeqW(xs)
class SeqW[A](xs: Seq[A]) {
def toListMap[B, C](implicit ev: A <~< (B, C)): ListMap[B, C] = {
ListMap(co[Seq, A, (B, C)](ev)(xs) : _*)
}
}
// Exiting paste mode, now interpreting.
seqW: [A](xs: Seq[A])SeqW[A]
defined class SeqW
scala> Seq((2, 4), (11, 89)).toListMap
res33: scala.collection.immutable.ListMap[Int,Int] = Map(2 -> 4, 11 -> 89)
Hay un problema con ListMap - actualización de llamada() con la clave * cambios * existentes en el orden de los elementos. Ejemplo: 'ListMap (" a "→ 1," b "→ 2) .updated (" a ", 2) .toList' produce' List ((b, 2), (a, 2)) '. Muy desafortunado para mi caso de uso :( –
Mientras ListMap
se preservar el orden de inserción, no es muy eficiente - por ejemplo, el tiempo de búsqueda es lineal. Le sugiero que cree una nueva clase de colección que incluya tanto el immutable.HashMap
como el immutable.TreeMap
. El mapa inmutable debe parametrizarse como immutable.HashMap[Key, (Value, Long)]
, donde Long
en la tupla le proporciona el puntero a la entrada correspondiente en el TreeMap[Long, Key]
. A continuación, mantenga un contador de entrada en el lateral. Este mapa de árbol ordenará las entradas de acuerdo con el orden de inserción.
Implementa la inserción y la búsqueda de la manera directa: incremente el contador, inserte en el mapa hash e inserte en el par de contra-teclas en el mapa de árbol. Utiliza el mapa hash para la búsqueda.
Implementa la iteración usando el mapa de árbol.
Para implementar eliminar, debe eliminar el par de clave-valor del mapa de hash y usar el índice de la tupla para eliminar la entrada correspondiente del mapa de árbol.
+1. ¿Alguna posibilidad de tener tal colección en stdlib en un futuro próximo? – missingfaktor
Esto no ha sido planeado, pero si la discusión en la lista de correo de Scala internals reveló que mucha gente quiere esto , entonces por qué no. – axel22
¿Le importaría explicar por qué? – axel22
- 1. Implementación de Scala Map manteniendo las entradas en orden de inserción?
- 2. ¿El conjunto en Ruby siempre conserva el orden de inserción?
- 3. ¿Cómo se conserva el orden de inserción en HashMap?
- 4. HashSet que conserva el pedido
- 5. un C++ mapa hash que preserve el orden de inserción
- 6. Scala Group¿Para conservar el orden de inserción?
- 7. A std :: map que realiza un seguimiento del orden de inserción?
- 8. Implementación de la utilización de orden de inserción java.util.Map como orden
- 9. ¿Hash iterativo basado en el orden de inserción?
- 10. Colecciones Java que mantienen el orden de inserción
- 11. Spring: orden de <map> tag
- 12. Establecer el orden de inserción de preservación de la colección
- 13. de contenedores STL que preserva el orden de inserción, pero no permite duplicados
- 14. ¿Cómo se convierte una java.util.Collections.unmodifiableMap en un mapa inamovible de Scala?
- 15. Java - JDialog inamovible
- 16. ¿PLINQ conserva el orden original en una secuencia?
- 17. Orden de inserción y recuperación de ArrayList
- 18. adaptativos Mapas en Scala (o Java) Preservar la Orden de Inserción
- 19. Google map Implementación en Iphone
- 20. CUDA - Implementación de dispositivo Hash Map?
- 21. usando boost multi_index_container para conservar la orden de inserción
- 22. Implementación de lista que mantiene el pedido
- 23. Scala Map: ¿azúcar sintáctico misterioso?
- 24. Implementación de una inserción CATransition con CAAnimation
- 25. Mapas (colección) que mantienen la inserción Orden en java
- 26. Cómo está Hibernate decidiendo el orden de actualización/inserción/eliminación
- 27. Ruby mantener el orden de inserción del hash
- 28. ¿Cómo iterar sobre Multimap en el orden de inserción?
- 29. Localidad que conserva la función hash
- 30. Implementación de MapReduce en Scala
Esto no es un duplicado exacto, la pregunta es para el mapa inmutable, el supuesto duplicado es sobre ambos mutable e inmutable. la otra pregunta no * directamente * responde a la parte inmutable (tal vez lo hace de manera indirecta) –