Question

J'ai une table de hachage. La méthode values ??() renvoie des valeurs dans un ordre différent de celui dans lequel je suis inséré. Comment puis-je obtenir les valeurs dans le même ordre que celui que j'ai inséré? Utiliser LinkedHashmap est une alternative, mais elle n'est pas synchronisée.

Était-ce utile?

La solution

Utilisez un LinkedHashMap .

  

Table de hachage et liste liée   implémentation de l'interface Map ,   avec un ordre d'itération prévisible. Ce   la mise en oeuvre diffère de HashMap dans   qu'il maintient une liste à double lien   parcourant toutes ses entrées.   Cette liste liée définit l'itération   la commande, qui est normalement la commande   dans lequel des clés ont été insérées dans le   map ( ordre d'insertion ). Notez que   l'ordre d'insertion n'est pas affecté si un   la clé est réinsérée dans la carte. (UNE   la clé k est réinsérée dans une carte m si    m.put (k, v) est appelé lorsque    m.containsKey (k) renverrait true   immédiatement avant l'invocation.)

combiné avec Collections.synchronizedMap () .

Ainsi, par exemple:

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());

Autres conseils

Vous pouvez envelopper un LinkedHashMap et le synchroniser ou utiliser l'utilitaire Collections.synchronizedMap pour créer un LinkedHashMap :

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

À partir du JavaDoc:

  

Si plusieurs threads accèdent simultanément à une mappe de hachage liée et qu’au moins un des threads modifie structurellement la mappe, celle-ci doit être synchronisée en externe. Ceci est généralement accompli en synchronisant sur un objet qui encapsule naturellement la carte. Si aucun objet de ce type n’existe, la carte doit être "enveloppée". en utilisant la méthode Collections.synchronizedMap. Cette opération est préférable au moment de la création, afin d'éviter tout accès non synchronisé accidentel à la carte

Je suis presque sûr que la raison pour laquelle les tables de hachage ne sont pas triées est destinée à faciliter le stockage et la vitesse de récupération. Pour cette raison, je suggérerais d'utiliser une structure externe pour maintenir l'ordre et d'utiliser simplement la table de hachage pour stocker les valeurs (pour une recherche rapide).

Une table de hachage est par nature non ordonnée, vous utilisez donc une structure de données incorrecte. Étant donné que vous ne spécifiez pas la langue que vous utilisez, je ne peux pas en proposer une autre, mais vous avez besoin d'un type de jeu clé / valeur ordonné.

Si jdk1.6, vous n’avez que deux types de cartes commandées EnumMap et LinkedHashMap. Les deux ne sont pas synchronisés. Si vous avez juste besoin de vous souvenir de la commande, utilisez

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

si vous voulez trier, utilisez ConcurrentSkipListMap

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top