En Java, j’utilise LinkedHashMap
à cette fin. La documentation de la variable LinkedHashMap
de Java indique très clairement qu'elle possède un "ordre d'itération prévisible" et que j'ai besoin de la même chose dans Scala.
Scala a ListMap
et LinkedHashMap
, mais la documentation sur ce qu’ils font exactement est médiocre.
Question: La variable LinkedHashMap
ou ListMap
de Scala est-elle une implémentation à utiliser à cette fin? Sinon, quelles autres options sont disponibles en plus d'utiliser directement la variable LinkedHashMap
de Java?
De la page LinkedHashMap
Scaladoc:
La différence entre les deux est que LinkedHashMap
est mutable alors que ListMap
est immuable. Sinon, les deux sont MapLike
et préservent également l'ordre d'insertion.
Pour LinkedHashMap, la réponse est assez claire: elle préserve l’ordre d’insertion.
Mais pour ListMap, il semble y avoir quelques confusions ici.
Tout d'abord, il y a deux ListMap.
Deuxièmement, le document pour ListMap a un problème aussi loin que j'ai essayé.
L'ordre réel n'est pas l'ordre d'insertion comme il est dit.
Et ce n'est pas non plus l'ordre inverse d'insertion. Le résultat que j'ai essayé est [quatrième, premier, troisième]
Une simple carte modifiable appuyée par une liste, elle préserve ainsi l'ordre d'insertion.
Comme le dit le document, la commande est la commande d'insertion.
Une chose à noter est qu'il est stocké en interne dans l'ordre d'insertion inversé. Et l'ordre stocké en interne et l'ordre itérable/traversal sont deux choses. L'ordre stocké en interne détermine la complexité temporelle des méthodes de recherche telles que head/last/tail/init /.
Cette classe implémente des cartes immuables à l'aide d'une structure de données basée sur des listes. Les itérateurs de carte de liste et les méthodes de parcours visitent les paires clé-valeur dans l'ordre où le lactosérum a été inséré.
Les entrées sont stockées en interne dans l'ordre d'insertion inversé, ce qui signifie que la clé la plus récente se trouve en tête de la liste.
LinkedHashmap est uniquement implémenté en tant que carte mutable. ListMaps est implémenté à la fois dans les packages mutable et immuable. Toutefois, seuls les ListMaps immuables conservent l'ordre inverse. (les listmaps mutables ne maintiennent pas l'ordre)
Scala 2.13 introduit deux nouvelles implémentations immuables de Map
qui conservent l’ordre d’insertion: VectorMap
et SeqMap
. Voir ceci PR : "
Actuellement, il n'y a pas de carte immuable connue qui maintienne également l'ordre d'insertion de la clé tout en conservant un temps de recherche constant sur la clé. Les seules implémentations connues sont réalisées en combinant un vecteur avec une carte HasMap (ou dans le cas de Scala HashMap/ChampHashMap)
Au moment de la rédaction de cet article, la sortie de Scala 2.13 est toujours prévue pour 2018.