LinkedHashMap
viene utilizzato per conservare l'ordine di inserimento nella mappa, ma funziona solo per mappe mutabili. Qual è l'implementazione immutabile Map
che conserva l'ordine di inserimento?Implementazione di Scala Scala immutabile che conserva l'ordine di inserimento
risposta
ListMap implementa una mappa immutabile utilizzando una struttura di dati basata su elenchi e quindi conserva l'ordine di inserimento.
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)
Il seguente metodo di estensione - Seq#toListMap
può essere molto utile quando si lavora 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)
C'è un trucco con ListMap - chiamando update() con la chiave esistente * cambia * l'ordine degli articoli. Esempio: 'ListMap (" a "→ 1," b "→ 2) .updated (" a ", 2) .toList' restituisce' List ((b, 2), (a, 2)) '. Molto spiacevole per il mio caso d'uso :( –
Mentre ListMap
conserveranno ordine di inserimento, non è molto efficiente - esempio il tempo di ricerca è lineare. Ti suggerisco di creare una nuova classe di raccolta che comprenda sia lo immutable.HashMap
sia lo immutable.TreeMap
. La mappa immutabile deve essere parametrizzata come immutable.HashMap[Key, (Value, Long)]
, dove lo Long
nella tupla fornisce il puntatore alla voce corrispondente nello TreeMap[Long, Key]
. Quindi tieni un contatore di entrata sul lato. Questa mappa albero ordinerà le voci in base all'ordine di inserimento.
Si implementa l'inserimento e la ricerca in modo diretto - incrementare il contatore, inserire nella mappa hash e inserire la coppia di chiavi in chiave nella mappa dei tre. Si utilizza la mappa hash per la ricerca.
Si implementa l'iterazione utilizzando la mappa ad albero.
Per implementare la rimozione, è necessario rimuovere la coppia chiave-valore dalla mappa hash e utilizzare l'indice dalla tupla per rimuovere la voce corrispondente dalla mappa dell'albero.
+1. Qualche possibilità di avere una tale collezione in stdlib nel prossimo futuro? – missingfaktor
Questo non è stato pianificato, ma se la discussione sulla mailing list di Scala internals ha rivelato che molte persone lo vogliono – axel22
Ti piacerebbe elaborare perché? – axel22
- 1. Scala Immutabile MultiMap
- 2. Scala GroupCome conservare l'ordine di inserimento?
- 3. Implementazione di ExpandoObject in Scala
- 4. Esiste una coda di priorità immutabile mantenuta in Scala?
- 5. Scala default Set Implementazione
- 6. Implementazione MapReduce in Scala
- 7. Implementazione di un interfaccia Java in Scala
- 8. Incoerenze di collezioni Scala
- 9. Rendimento di implementazione (rendimento restituito) utilizzando le continuazioni di Scala
- 10. Scala: implementazione di un sottotipo di Numerico [T]
- 11. Scala: implementazione client Redis con Akka futures
- 12. Analoghi Scala di QtConcurrent
- 13. Implementazione della funzione di inserimento
- 14. HashSet che conserva l'ordine
- 15. Come inizializzare una scala hashmap immutabile con valori?
- 16. letrec in Scala? ("? Legare il nodo" via Immutabile a)
- 17. Procedura consigliata per utilizzare la scala immutabile Coda
- 18. Come si converte una java.util.Collections.unmodifiableMap in una Scala Map immutabile?
- 19. scala implicit che si completa?
- 20. Implementazione efficiente della mappa immutabile?
- 21. Scala che registra i risultati del costruttore di mixin immutabilmente
- 22. implementazione Scala di C# -come resa con "per"
- 23. Come evitare perdite di memoria Scala - costruttori Scala
- 24. Modello di scala che corrisponde ai set
- 25. Che cos'è la "Scala di terza generazione"?
- 26. scala scala 2
- 27. Codice scala infinita scala
- 28. Come definire un operatore ternario in Scala che conserva i token principali?
- 29. Esiste una libreria .net che ha una classe Vector immutabile persistente (come trovata in Clojure/Scala)?
- 30. Confusione costruttore di scala - chiarire
Questo non è un duplicato esatto, la domanda è per la mappa Immutabile, il presunto duplicato riguarda sia mutabile che immutabile. l'altra domanda non * direttamente * risponde alla parte immutabile (forse lo fa indirettamente) –