2009-09-14 7 views
19

J'ai une hashtable. La méthode values ​​() renvoie des valeurs dans un ordre différent de l'ordre dans lequel je suis inséré.Comment puis-je obtenir les valeurs dans le même ordre que j'ai inséré? L'utilisation de LinkedHashmap est une alternative mais elle n'est pas synchronisée.Comment garder l'ordre des éléments en hashtable

+0

Quelle langue utilisez-vous? –

+0

LinkedHashMap fait partie de Java. – jimyi

+0

J'utilise Java. JDK1.6 –

Répondre

31

Utilisez un LinkedHashMap.

table de hachage et la liste liées la mise en œuvre de l'interface Map, avec ordre d'itération prévisible. Cette implémentation diffère de HashMap par qu'elle maintient une liste à double liaison passant par toutes ses entrées. Cette liste chaînée définit l'ordre d'itération , qui est normalement l'ordre dans lequel les clés ont été insérées dans la carte (insertion-order). Notez que l'ordre d'insertion n'est pas affecté si une clé est réinsérée dans la carte. (A clé k est réinséré dans une carte m si m.put(k, v) est appelé lorsque m.containsKey(k) retournerait true immédiatement avant l'invocation.)

combiné avec Collections.synchronizedMap().

Ainsi, par exemple:

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

Pour clarifier: Si je ne cherche pas à avoir plus de 1 pas d'accès à ce 'LinkedHashMap' à la fois, serait-il encore recommandé de le synchroniser? Ou le 'LinkedHashMap' sur son propre serait considéré assez? – blo0p3r

+1

@ blo0p3r Le 'LinedHashMap' devrait suffire à lui seul. –

1

Une table de hachage est intrinsèquement non ordonnée, vous utilisez donc une structure de données incorrecte. Puisque vous ne spécifiez pas la langue que vous utilisez, je ne peux pas suggérer une autre langue, mais vous avez besoin d'un certain type de jeu de clés/valeurs ordonnées.

+0

J'utilise Java. JDK1.6 –

2

Je suis assez sûr que les tables de hachage raison sont non triés est d'aider le stockage et la vitesse de récupération. Pour cette raison, je suggère d'utiliser une structure externe pour maintenir l'ordre et juste en utilisant la hashtable pour stocker des valeurs (pour une recherche rapide).

4

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

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

De l'JavaDoc:

Si plusieurs threads accèdent à une carte de hachage liée en même temps, et au moins un des threads modifie structurellement la carte, il doit être synchronisé extérieurement. 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" à l'aide de la méthode Collections.synchronizedMap. Ceci est mieux fait au moment de la création, pour éviter un accès non synchronisé accidentel à la carte

+0

merci beaucoup .. mais ce sera un succès de performance? –

+0

La surcharge de performance sera négligeable (littéralement nanosecondes). – Adamski

1

Si jdk1.6 vous avez seulement deux types de carte ordonnée EnumMap et LinkedHashMap. Les deux ne sont pas synchronisés.Si vous avez juste besoin de se rappeler l'ordre, utilisez

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

si vous voulez utiliser puis ConcurrentSkipListMap Sorted

Questions connexes