Est de l'ordre des valeurs récupérées à partir d'une table de hachage de l'ordre d'insertion
Je suis en train déterminer l'ordre dans lequel les valeurs dans une table de hachage sont/peuvent être récupérées. Voici l'extrait de code pour la même chose.
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
hashmap.put(1, "apple" );
hashmap.put(2, "lemon" );
hashmap.put(3, "orange" );
hashmap.put(4, "banana" );
hashmap.put(5, "litchi" );
hashmap.put(6, "mango" );
hashmap.put(7, "papaya" );
System.out.println(hashmap.size());
for (String key : hashmap.values()) {
System.out.println(key);
}
}
}
de sortie:
7
apple
lemon
orange
banana
litchi
mango
papaya
Les valeurs sont imprimées dans l'ordre dans lequel ils ont été insérés. Est-ce vrai en général? Je m'attendais à les valeurs à être imprimé dans un ordre arbitraire. C'est à l'aide de Java 6.
- Il suffit d'utiliser un LinkedHashMap.
- D'accord, mais elle a fait poser au sujet de l'insertion de l'ordre plusieurs fois, et il semble que LinkedHashMap vaut probablement la peine de regarder.
Vous devez vous connecter pour publier un commentaire.
La
HashMap
API ne permet pas de définir l'ordre d'itération.Cependant, si vous regardez à la mise en œuvre de la table de hachage, vous pouvez en déduire qu'il existe un complexe transitoire de la relation entre l'itération de commande, les touches de valeurs de hachage, l'ordre dans lequel les clés ont été insérées et la taille de la table de hachage. Cette relation devient brouillé si la table de hachage redimensionne.
Dans votre cas, vous êtes à l'aide de
Integer
clés qui signifie que les valeurs de hachage dont les clés sont les valeurs clés eux-mêmes. Aussi, vous avez inséré les entrées dans l'ordre des clés. Cela conduit (par hasard!) à l'itération de l'ordre correspondant à l'ordre d'insertion. Mais si vous avez gardé l'insertion de plus de touches, vous constaterez que l'itération de l'ordre ", s'enroule autour de". Alors que la table passe par une série de changement de taille, l'ordre va devenir de plus en plus et de plus en plus brouillés.En bref, ce que vous voyez est un artefact de la table de hachage de la mise en œuvre, et non pas quelque chose que vous pouvez (ou devez) raisonnablement faire usage de. Pas moins parce qu'il pourrait changement de Java version à la suivante.
De la Javadoc:
HashMap
"de la classe ne donne aucune garantie quant à l'ordre de la carte; en particulier, il ne garantit pas que l'ordre demeure constante au cours du temps."Si vous avez besoin d'conforme à votre commande, vous pouvez utiliser
LinkedHashMap
(pour l'insertion/accès à la commande), ouTreeMap
(pour comparaison l'ordre). Veuillez noter que ces maintenir l'ordre des clés, pas les valeurs.Map.Entry
). Ainsi, les valeurs seront la plupart apparaissent également dans le même ordre que leurs clés associées.Un LinkedHashMap est ce que vous êtes après. À partir de la doco, il diffère de la table de hachage en ce qu'il maintient une liste à double liaison cours d'exécution à travers l'ensemble de ses entrées
Essayer LinkedHashMap si l'ordre est important... voir de JavaDoc
Une collection de est java.util.simultanées du ConcurrentSkipListMap. Un skiplist permet de traverser les entrées dans l'ordre des clés et aussi regarder dans un ordre aléatoire (mais pas aussi rapide qu'une table de hachage).
Il y a une belle skiplist applet de démonstration.