web-dev-qa-db-fra.com

Mise en œuvre de Scala Map en conservant les entrées dans l'ordre d'insertion?

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?

38
ebruchez

De la page LinkedHashMap Scaladoc:

  • "Cette classe implémente des cartes mutables à l'aide d'une table de hachage. L'itérateur et toutes les méthodes de parcours de cette classe visitent les éléments dans leur ordre d'insertion."
45
Randall Schulz

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.

14
Reid Spencer

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.

  • scala.collection.mutable.ListMap
  • scala.collection.immutable.ListMap.

Deuxièmement, le document pour ListMap a un problème aussi loin que j'ai essayé.

mutable.ListMap

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.

immutable.ListMap

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.

5
Michelle
  • LinkedHashmap est dans l'ordre où il a été ajouté
  • (immuable) ListMap est dans l’ordre inverse où il a été ajouté (c’est-à-dire que le dernier ajouté est le premier)

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)

3
Andrew Norman

ListMap ne conserve pas l'ordre d'insertion.

 enter image description here

Seul LinkedHashMap conserve l'ordre des éléments dans leur insertion.

 enter image description here

Si vous souhaitez maintenir l'ordre dans les listes autres que la carte, vous pouvez utiliser LinkedList

 enter image description here

2
Nandakishore

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.

0
ebruchez