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:

  1. ajouter les valeurs à Hashtable .
  2. obtenir un itérateur pour le Hashtable.entrySet() .
  3. itérer toutes les valeurs et:
    1. obtenez un Map.Entry pour l'itérateur.
    2. créer un objet de type Module (une classe personnalisée) basée sur la valeur.
    3. ajouter la catégorie à un JPanel.
  4. 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!

371
demandé sur Vasily Kabunov 2009-03-26 00:22:04

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.

605
répondu Michael Myers 2014-12-17 14:47:27

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.

13
répondu jvdneste 2017-09-04 09:29:35

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 
7
répondu Praveen Kishor 2017-05-08 21:26:41

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.

5
répondu Peter Lawrey 2016-07-31 22:02:33

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.

1
répondu jpalecek 2009-03-25 21:29:45

vous pouvez essayer mon implémentation arborescence liée .

1
répondu 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 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

1
répondu j2emanue 2017-11-09 08:36:32

vous pouvez utiliser LinkedHashMap à l'ordre d'insertion principal dans la carte

les points importants de la classe Java LinkedHashMap sont:

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

0
répondu Pankaj Goyal 2018-06-19 07:32:09