Question

Je suis à la recherche d'une classe en java qui a une association clé-valeur, mais sans utiliser hash. Voici ce que je fais actuellement:

  1. Ajouter des valeurs à un Hashtable.
  2. Obtenir un itérateur pour l'Hashtable.entrySet().
  3. itérer toutes les valeurs et:
    1. Obtenir un Map.Entry pour le iterator.
    2. Créer un objet de type Module (une classe personnalisée) basée sur la valeur.
    3. Ajouter la classe à un JPanel.
  4. Afficher le panneau.

Le problème c'est que je ne dispose pas de contrôle sur l'ordre que je reçois les valeurs de retour, donc je ne peux pas afficher les valeurs dans l'ordre donné (sans coder en dur l'ordre).

J'utiliser un ArrayList ou Vector pour cela, mais plus tard dans le code je dois saisir l'objet Module pour une clé donnée, que je ne peux pas faire avec un ArrayList ou Vector.

Quelqu'un sait-il d'une classe Java libre / open-source qui cela, ou un moyen d'obtenir des valeurs d'un Hashtable en fonction du moment où ils ont été ajoutés?

Merci!

Était-ce utile?

La solution

Je suggère un LinkedHashMap ou TreeMap . Un LinkedHashMap conserve les clés dans l'ordre où ils ont été insérés, tandis qu'un TreeMap est maintenu triée par un Comparator ou l'ordre de Comparable naturel des éléments.

Comme il ne doit pas garder les éléments triés, LinkedHashMap devrait être plus rapide pour la plupart des cas; TreeMap a des performances de O(log n) pour containsKey, get, put et remove, selon la Javadocs, tandis que LinkedHashMap est O(1) pour chacun.

Si votre API qui attend seulement un ordre de tri prévisible, 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 fuyez implémentations spécifiques dans votre API et passer à l'une de ces classes spécifiques ou d'une mise en œuvre complètement différente à volonté par la suite.

Autres conseils

LinkedHashMap renverra les éléments dans l'ordre où ils ont été insérés dans la carte lorsque vous itérer sur la keySet (), 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 affichera les éléments dans l'ordre où ils ont été mis dans la carte:

id = 1
name = rohan 
age = 26 

Si une carte immuable correspond à vos besoins puis il y a une bibliothèque par google appelé goyave (voir aussi goyave )

Goyave fournit un ImmutableMap avec fiable ordre d'itération spécifiée par l'utilisateur. Cette ImmutableMap a O (1) pour la performance containsKey, obtenir. De toute évidence mis et supprimer ne sont pas pris en charge.

ImmutableMap objets sont construits en utilisant soit les méthodes pratiques statiques élégantes de () et copyOf () ou l'objet du constructeur.

Vous pouvez maintenir un Map (pour la recherche rapide) et List (de l'ordre), mais un LinkedHashMap peut-être le plus simple. Vous pouvez également essayer un SortedMap par exemple TreeMap, qui ont un ordre quelconque que vous spécifiez.

Je ne sais pas si elle est opensource, mais après un peu googler, j'ai trouvé cette mise en œuvre de cartes à l'aide ArrayList. Il semble être pré-Java 1.5, vous voudrez peut-être genericize, ce qui devrait être facile. Notez que cette mise en œuvre a O (N) l'accès, mais cela ne devrait pas être un problème si vous ne pas ajouter des centaines de widgets à votre JPanel, que vous ne devriez pas de toute façon.

Vous pouvez essayer mon liés Treemap la mise en œuvre .

Chaque fois que je dois maintenir l'ordre naturel des choses qui sont en avance connus du temps, j'utiliser un EnumMap

les touches seront énumérations et vous pouvez insérer dans l'ordre que vous voulez, mais quand vous itérer il itérera dans l'ordre ENUM (l'ordre naturel).

En outre lors de l'utilisation EnumMap il devrait y avoir aucune collision qui peut être plus efficace.

Je trouve vraiment que l'utilisation enumMap fait pour un code lisible propre. Voici un exemple

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

Les points importants sur la classe Java LinkedHashMap sont:

  1. Il contient des éléments onlyunique.
  2. A LinkedHashMap contient des valeurs sur la base de la clé 3.It peut avoir une clé nulle et plusieurs valeurs nulles. 4.It est le même que HashMap maintient à la place un ordre d'insertion

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 
    

Mais si vous voulez trier les valeurs carte à l'aide de l'objet défini par l'utilisateur ou une touche de type de données primitive, alors vous devez utiliser TreeMap Pour plus d'informations, reportez-vous ce lien

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top