Classe Java qui implémente Map et conserve l'ordre d'insertion?
Je cherche une classe en java qui a une association clé-valeur, mais sans utiliser de hachage. Voici ce que je fais actuellement:
- Ajouter des valeurs à un
Hashtable
. - Obtenir un itérateur pour la
Hashtable.entrySet()
. - Parcourir toutes les valeurs et:
- Obtenir un
Map.Entry
pour l'itérateur. - Créez un objet de type
Module
(une classe personnalisée) en fonction de la valeur. - Ajouter la classe à un JPanel.
- Obtenir un
- Afficher le panneau.
Le le problème avec cela est que je n'ai pas de contrôle sur l'ordre dans lequel je récupère les valeurs, donc je ne peux pas afficher les valeurs dans un ordre donné (sans coder en dur l'ordre).
J'utiliserais un ArrayList
ou Vector
pour cela, mais plus tard dans le code, je dois saisir l'objet Module
pour une clé donnée, ce que je ne peux pas faire avec un ArrayList
ou Vector
.
Quelqu'un connaît-il une classe Java libre/open-source qui le fera, ou un moyen d'obtenir des valeurs d'un Hashtable
en fonction du moment où elles étaient ajoutée?
Merci!
8 answers
Je vous propose un LinkedHashMap
ou un TreeMap
. A LinkedHashMap
conserve les clés dans l'ordre dans lequel elles ont été insérées, tandis que a TreeMap
est maintenu trié via un Comparator
ou l'ordre naturel Comparable
des éléments.
, Car il n'a pas à garder les éléments triés, LinkedHashMap
devrait être plus rapide pour la plupart des cas; TreeMap
a O(log n)
performance pour containsKey
, get
, put
, et remove
, selon la Javadoc, tandis que LinkedHashMap
est O(1)
pour chaque.
Si votre API n'attend qu'un tri prévisible l'ordre, par opposition à un ordre de tri spécifique, pensez à utiliser les interfaces de ces deux classes implémentent, NavigableMap
ou SortedMap
. Cela vous permettra de ne pas divulguer d'implémentations spécifiques dans votre API et de passer à l'une de ces classes spécifiques ou à une implémentation complètement différente à volonté par la suite.
Si une carte immuable correspond à vos besoins alors il existe une bibliothèque de Google appelée guava (voir aussi questions sur la goyave)
Guava fournit unImmutableMap avec un ordre d'itération fiable spécifié par l'utilisateur. Ce ImmutableMap a des performances O(1) pour containsKey, get. Évidemment, put et remove ne sont pas pris en charge.
ImmutableMap les objets sont construits en utilisant les méthodes de commodité statiques élégantes de() et copyOf() ou Constructeur objet.
LinkedHashMap renverra les éléments dans l'ordre dans lequel ils ont été insérés dans la carte lorsque vous itérez sur le jeu de clés(), entrySet() ou values() de la carte.
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
Cela imprimera les éléments dans l'ordre dans lequel ils ont été mis dans la carte:
id = 1
name = rohan
age = 26
, Vous pouvez conserver une Map
(pour la recherche rapide) et List
(pour ordre), mais un LinkedHashMap
peut être le plus simple. Vous pouvez également essayer un SortedMap
par exemple TreeMap
, qui a un ordre que vous spécifiez.
Je ne sais pas si c'est opensource, mais après un peu de recherche sur Google, j'ai trouvé cette implémentation de Map en utilisant ArrayList. Il semble être pré-1.5 Java, donc vous voudrez peut-être le génériquer, ce qui devrait être facile. Notez que cette implémentation a un accès O(N), mais cela ne devrait pas être un problème si vous n'ajoutez pas des centaines de widgets à votre JPanel, ce que vous ne devriez pas de toute façon.
Vous pouvez essayer mon implémentation Linked Tree Map.
Chaque fois que j'ai besoin pour maintenir l'ordre naturel des choses qui sont connues à l'avance, j'utilise un EnumMap
Les clés seront des énumérations et vous pouvez les insérer dans l'ordre de votre choix, mais lorsque vous itérez, elles seront itérées dans l'ordre d'énumération (l'ordre naturel).
Également lors de l'utilisation d'EnumMap, il ne devrait pas y avoir de collisions qui peuvent être plus efficaces.
Je trouve vraiment que l'utilisation d'enumMap rend le code lisible propre. Voici un exemple
Vous pouvez utiliser LinkedHashMap {[3] } pour l'ordre d'insertion principal dans la carte
Les points importants à propos de la classe Java LinkedHashMap sont:
- Il contient seulementéléments uniques.
-
Un LinkedHashMap contient des valeurs basées sur la clé 3.It peut avoir une clé null et plusieurs valeurs null. 4.It est identique à HashMap à la place maintient l'ordre d'insertion
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
Mais si vous voulez trier les valeurs dans la carte en utilisant un objet défini par l'utilisateur ou toute clé de type de données primitives, alors vous devez utiliser TreeMap Pour plus d'informations, reportez-vous ce lien