27 votes

Implémentation Scala Map immuable qui préserve l'ordre d'insertion

Je sais que LinkedHashMap est utilisé pour préserver l'ordre d'insertion dans la carte, mais cela ne fonctionne que pour les cartes mutables. Quelle est l'implémentation immuable de Map qui préserve l'ordre d'insertion?

Merci

34voto

missingfaktor Points 44003

ListMap implémente une carte immuable à l'aide d'une structure de données basée sur une liste et préserve ainsi l'ordre d'insertion.

 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)
 

La méthode d'extension suivante - Seq#toListMap peut être très utile lorsque vous travaillez avec 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)
 

14voto

axel22 Points 17400

Alors qu' ListMap permettra de préserver l'ordre d'insertion, il n'est pas très efficace - par exemple la recherche du temps est linéaire. Je vous suggère de créer une nouvelle classe de collection qui englobe à la fois l' immutable.HashMap et de la immutable.TreeMap. Les lois immuables de la carte doivent être paramétrés en tant que immutable.HashMap[Key, (Value, Long)], où l' Long dans le tuple vous donne le pointeur sur l'entrée correspondante dans l' TreeMap[Long, Key]. Ensuite, vous gardez une entrée de compteur sur le côté. Cet arbre de la carte va trier les entrées, selon l'ordre d'insertion.

Vous mettre en œuvre l'insertion et de la recherche dans la façon simple - incrémenter le compteur, l'insérer dans le hachage de la carte et insérez-la dans la contre-paire de clés dans le treemap. Vous utilisez la carte de hachage pour la recherche.

Vous mettre en œuvre par itération à l'aide de l'arborescence de la carte.

Pour mettre en œuvre les supprimer, vous devez supprimer la paire clé-valeur de hachage de la carte et utiliser l'index à partir de la n-uplet pour supprimer l'entrée correspondante dans l'arborescence de la carte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X