7
votes

Comment éviter d'être commandé lors de la mise en place de Java Hashmap

Je crée une nouvelle carte et je pousse des chaînes dans celle-ci (pas de gros problème) - mais j'ai remarqué que les chaînes sont en train d'être commandées car la carte grandit. Est-il possible d'arrêter ce réchérum qui se produit pour que les éléments de la carte conservent la commande avec qui ont été placés?

Map<String,String> x = new HashMap<String, String>();
x.put("a","b");
x.put("a","c");
x.put("a","d");

x.put("1","2");
x.put("1","3");
x.put("1","4");

//this shows them out of order sadly...
for (Map.Entry<String, String> entry : x.entrySet()) {
    System.out.println("IN THIS ORDER ... " + entry.getValue());
}


7 commentaires

Si ce n'est pas trié, il ne peut pas être un haschmap, vraiment ...


@Tdammers - hein? Pourriez-vous s'il vous plaît expliquer cela?


Si elle triée, ce n'est pas une carte de hachage serait plus précise. Une carte de hash place les entrées est un motif aléatoire. LinkedHashMap masque ceci en vous souvenant également de l'ordre que vous avez ajouté ou de l'ordre de la dernière utilisation. Cependant, ils seront toujours placés dans un ordre aléatoire dans son magasin sous-jacent.


Ce que je veux dire, c'est que l'algorithme de stockage HASHMAP trie les entrées par leur hachage pour permettre la recherche de hasch O (log n) (ou plutôt, le tri se produit comme un effet secondaire de la manière dont un hashmap stocke ses entrées). Le tri par hasch n'est pas un schéma aléatoire, même s'il peut ressembler à celui de la nature arbitraire des valeurs de hachage.


@TDAMMERS probablement une faute de frappe là-bas - HASHMAPS s'efforce de O (1) Recherche en moyenne; Treimaps Efforcez-vous de O (log n).


@Ray Toal: Point pris - bien que l'argument tel qu'il soit.


@Tdammers Oui Votre argument est définitivement sur place. J'étais juste nitpicking.


4 Réponses :


23
votes

Si vous vous souciez de votre commande, vous pouvez utiliser un triedmap < / code> . La classe actuelle qui implémente l'interface (au moins pour la plupart des scénarios) est un Treemap . Alternativement, linkedhashmap maintient également sa commande, tout en utilisant toujours un conteneur à base de hashtable.


1 commentaires

Notez que l'ajout de '7' à une recherche du Javadoc d'une classe entraînera généralement un lien qui pointe directement sur les documents Derniers .



12
votes

Vous pouvez le garder avec linkedhashmap .


0 commentaires

7
votes

Un hashmap en Java n'est pas trié http://download.oracle.com/javase/1,5.0/docs/api/java/util/hashmap.html . Si vous voulez une commande d'itération prévisible, utilisez plutôt un linkedHashMap à la place: http://download.oracle.com/javase/1.4.2/docs/api/java/util/linkedhashmap.html

Heres une bonne discussion à la différence: Comment est le Mise en œuvre de LinkedHashMap différent de HASHMAP?


1 commentaires

Notez que l'ajout de '7' à une recherche du Javadoc d'une classe entraînera généralement un lien qui pointe directement sur les documents Derniers .



4
votes

Les réponses précédentes sont correctes que vous devez utiliser une implémentation de la carte qui maintient la commande. LinkedHashMap et trièrent chacun fait ces choses.

Cependant, le point à emporter est que toutes les collections ne maintiennent pas la commande et si la commande est importante pour vous, vous devez choisir la mise en œuvre appropriée. Les hashmaps génériques ne maintiennent pas la commande, ne prétendent pas le faire et ne peuvent pas être réglées pour le faire.


0 commentaires