Classe Java qui implémente Map et maintient 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 les valeurs à
Hashtable
. - obtenir un itérateur pour le
Hashtable.entrySet()
. - itérer toutes les valeurs et:
- obtenez un
Map.Entry
pour l'itérateur. - créer un objet de type
Module
(une classe personnalisée) basée sur la valeur. - ajouter la catégorie à un JPanel.
- obtenez un
- afficher le panneau.
le problème avec cela est que je n'ai pas le contrôle sur l'ordre que je reçois les valeurs de retour, donc je ne peux pas afficher les valeurs dans l'ordre a donné (sans codage dur l'ordre).
j'utiliserais un ArrayList
ou Vector
pour cela, mais plus tard dans le code je dois saisir le Module
objet pour une clé donnée, ce que je ne peux pas faire avec un ArrayList
ou Vector
.
est-ce que quelqu'un connaît une classe Java libre/open-source qui fera cela, ou une façon d'obtenir des valeurs à partir d'un Hashtable
basé sur quand ils ont été ajoutés?
Merci!
8 réponses
je suggère un LinkedHashMap
ou un TreeMap
. Un LinkedHashMap
conserve les clés dans l'ordre où elles ont été insérées, tandis qu'un TreeMap
est conservé trié via un Comparator
ou l'ordre naturel Comparable
des éléments.
Puisqu'il ne doit pas garder les éléments triés, LinkedHashMap
devrait être plus rapide pour la plupart des cas; TreeMap
a O(log n)
performances pour containsKey
, get
, put
, et remove
, selon les Javadocs, tandis que LinkedHashMap
est O(1)
pour chacun.
si votre API n'attend qu'un ordre de tri prévisible, par opposition à un ordre de tri spécifique, envisagez d'utiliser les interfaces que 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 implémentations spécifiques des classes ou une implémentation complètement différente à volonté par la suite.
si une carte immuable correspond à vos besoins alors il ya une bibliothèque par google appelé goyave (voir aussi questions de goyave )
Guava fournit un ImmutableMap avec un ordre d'itération fiable spécifié par l'utilisateur. Ce ImmutableMap a la performance O(1) pour containsKey, get. Évidemment put et remove ne sont pas supportés.
Immutablmap les objets sont construits en utilisant soit les élégantes méthodes de commodité statique de () et copyOf () ou un constructeur objet.
LinkedHashMap renverra les éléments dans l'ordre où ils ont été insérés dans la carte lorsque vous itérerez au-dessus de la clé(), de l'entrySet() ou des valeurs() 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 où ils ont été mis sur la carte:
id = 1
name = rohan
age = 26
vous pouvez maintenir un Map
(pour la recherche rapide) et List
(pour la commande) mais un LinkedHashMap
peut être le plus simple. Vous pouvez également essayer un SortedMap
par exemple TreeMap
, qui ont n'importe quel ordre que vous spécifiez.
Je ne sais pas si c'est opensource, mais après un petit googling, j'ai trouvé cette implémentation de Map en utilisant ArrayList . Il semble être pré-Java 1.5, donc vous pourriez vouloir le généraliser, 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 arborescence liée .
Chaque fois que j'ai besoin pour maintenir l'ordre naturel des choses qui sont connues à l'avance, j'utilise un EnumMap
les touches seront enum et vous pouvez insérer dans n'importe quel ordre que vous voulez mais quand vous itérez il itérera dans l'ordre enum (l'ordre naturel).
aussi lors de L'utilisation de EnumMap il ne doit pas y avoir de collisions qui peuvent être plus efficaces.
je trouve vraiment que l'utilisation d'enumMap rend propre un code lisible. Voici un exemple
vous pouvez utiliser LinkedHashMap à l'ordre d'insertion principal dans la carte
les points importants de la classe Java LinkedHashMap sont:
- Il contient onlyunique éléments.
-
Une LinkedHashMap contient des valeurs en fonction de la clé 3.Il peut avoir une clé nulle et des valeurs nulles multiples. 4.Il est identique à HashMap 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 L'objet défini par L'utilisateur ou n'importe quelle clé de type de données primitive alors vous devez utiliser TreeMap pour plus d'informations, se référer à ce lien