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:

  1. Ajouter des valeurs à un Hashtable.
  2. Obtenir un itérateur pour la Hashtable.entrySet().
  3. Parcourir toutes les valeurs et:
    1. Obtenir un Map.Entry pour l'itérateur.
    2. Créez un objet de type Module (une classe personnalisée) en fonction de la valeur.
    3. Ajouter la classe à un JPanel.
  4. 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!

Author: Vasily Kabunov, 2009-03-26

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.

 605
Author: Michael Myers, 2014-12-17 14:47:27

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.

 13
Author: jvdneste, 2017-09-04 09:29:35

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 
 7
Author: Praveen Kishor, 2017-05-08 21:26:41

, 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.

 5
Author: Peter Lawrey, 2016-07-31 22:02:33

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.

 1
Author: jpalecek, 2009-03-25 21:29:45

Vous pouvez essayer mon implémentation Linked Tree Map.

 1
Author: Lawrence Dol, 2010-02-02 21:16:54

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

 1
Author: j2emanue, 2017-11-09 08:36:32

Vous pouvez utiliser LinkedHashMap {[3] } pour l'ordre d'insertion principal dans la carte

Les points importants à propos de la classe Java LinkedHashMap sont:

  1. Il contient seulementéléments uniques.
  2. 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

 0
Author: Pankaj Goyal, 2018-06-19 07:32:09