Je recherche une classe en java qui a une association clé-valeur, mais sans utiliser de hachage. Voici ce que je fais actuellement:
- Ajoutez des valeurs à a
Hashtable
. - Obtenez un itérateur pour le
Hashtable.entrySet()
. - Parcourez toutes les valeurs et:
- Obtenez un
Map.Entry
pour l'itérateur. - Créez un objet de type
Module
(une classe personnalisée) en fonction de la valeur. - Ajoutez la classe à un JPanel.
- Obtenez un
- Montrez le panneau.
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 l'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' 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 un moyen d'extraire des valeurs d'un en Hashtable
fonction de leur date d'ajout?
Merci!
java
dictionary
key-value
Shane
la source
la source
Réponses:
Je suggère un
LinkedHashMap
ou unTreeMap
. ALinkedHashMap
conserve les clés dans l'ordre dans lequel elles ont été insérées, tandis que aTreeMap
est conservé trié via aComparator
ou l'Comparable
ordre naturel des éléments.Puisqu'il n'a pas à garder les éléments triés,
LinkedHashMap
devrait être plus rapide dans la plupart des cas;TreeMap
aO(log n)
performance pourcontainsKey
,get
,put
, etremove
, selon le Javadocs, tandis queLinkedHashMap
estO(1)
pour chacun.Si votre API qui n'attend qu'un ordre de tri prévisible, par opposition à un ordre de tri spécifique, envisagez d'utiliser les interfaces implémentées par ces deux classes,
NavigableMap
ouSortedMap
. 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.la source
LinkedHashMap renverra les éléments dans l'ordre où ils ont été insérés dans la carte lorsque vous parcourez le keySet (), entrySet () ou les valeurs () de la carte.
Cela imprimera les éléments dans l'ordre où ils ont été placés dans la carte:
la source
Si une carte immuable correspond à vos besoins, il existe une bibliothèque de Google appelée goyave (voir aussi les questions sur la goyave )
Guava fournit un ImmutableMap avec un ordre d'itération fiable spécifié par l'utilisateur. Cette ImmutableMap a les performances O (1) pour containsKey, get. De toute évidence, les mises et suppressions ne sont pas prises en charge.
Les objets ImmutableMap sont construits à l'aide des élégantes méthodes de commodité statique de () et copyOf () ou d'un objet Builder .
la source
Vous pouvez conserver un
Map
(pour une recherche rapide) etList
(pour une commande) mais unLinkedHashMap
peut être le plus simple. Vous pouvez également essayer unSortedMap
exempleTreeMap
, qui a n'importe quelle commande que vous spécifiez.la source
Je ne sais pas si c'est open source, mais après un peu de recherche, j'ai trouvé cette implémentation de Map en utilisant ArrayList . Il semble qu'il s'agisse de Java antérieur à la version 1.5, vous pouvez donc 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.
la source
Vous pouvez essayer mon implémentation Linked Tree Map .
la source
Chaque fois que j'ai besoin de maintenir l'ordre naturel des choses connues à l'avance, j'utilise un EnumMap
les clés seront des énumérations et vous pourrez les insérer dans n'importe quel ordre, mais lorsque vous itérerez, elles seront répétées dans l'ordre énuméré (l'ordre naturel).
De plus, lorsque vous utilisez EnumMap, il ne devrait pas y avoir de collisions qui pourraient être plus efficaces.
Je trouve vraiment que l'utilisation de enumMap permet d'obtenir un code propre et lisible. Voici un exemple
la source
Vous pouvez utiliser LinkedHashMap pour l'ordre d'insertion principal dans la carte
Les points importants sur la classe Java LinkedHashMap sont:
Un LinkedHashMap contient des valeurs basées sur la clé 3. Il peut avoir une clé null et plusieurs valeurs null. 4.C'est la même chose que HashMap maintient à la place l'ordre d'insertion
Mais si vous souhaitez trier les valeurs dans la carte à l'aide d'un objet défini par l'utilisateur ou d'une clé de type de données primitive, vous devez utiliser TreeMap Pour plus d'informations, reportez - vous à ce lien
la source
Vous pouvez soit utiliser,
LinkedHashMap<K, V>
soit implémenter votre propre CustomMap qui maintient l'ordre d'insertion.Vous pouvez utiliser le suivant
CustomHashMap
avec les fonctionnalités suivantes:null
ou des chaînes vides ne sont pas autorisées.HashMap
vsLinkedHashMap
vsCustomHashMap
Utilisation de
CustomHashMap
:O / P:
Si vous savez que les CLÉS sont fixes, vous pouvez utiliser EnumMap. Récupérer les valeurs du formulaire Propriétés / Fichiers XML
EX:
la source