Classe Java che implementa la mappa e mantiene l’ordine di inserimento?

Sto cercando una class in java che abbia un’associazione valore-chiave, ma senza usare gli hash. Ecco cosa sto facendo attualmente:

  1. Aggiungi valori a un Hashtable .
  2. Ottieni un iteratore per Hashtable.entrySet() .
  3. Iterate attraverso tutti i valori e:
    1. Ottieni una Map.Entry per l’iteratore.
    2. Creare un object di tipo Module (una class personalizzata) in base al valore.
    3. Aggiungi la class a un JPanel.
  4. Mostra il pannello.

Il problema con questo è che non ho il controllo sull’ordine in cui ottengo i valori, quindi non posso visualizzare i valori in un dato ordine (senza codificare l’ordine).

Vorrei usare un ArrayList o Vector per questo, ma più avanti nel codice ho bisogno di prendere l’object Module per una determinata chiave, cosa che non posso fare con ArrayList o Vector .

Qualcuno sa di una class Java libera / open-source che lo farà, o un modo per ottenere valori da una Hashtable base a quando sono stati aggiunti?

Grazie!

    Suggerisco una LinkedHashMap o una TreeMap . Una LinkedHashMap mantiene le chiavi nell’ordine in cui sono state inserite, mentre una TreeMap viene tenuta ordinata tramite un Comparator o l’ordinamento naturale Comparable degli elementi.

    Poiché non deve mantenere ordinati gli elementi, LinkedHashMap dovrebbe essere più veloce per la maggior parte dei casi; TreeMap ha TreeMap O(log n) per containsKey , get , put e remove , secondo Javadocs, mentre LinkedHashMap è O(1) per ciascuno.

    Se la tua API si aspetta solo un ordine di ordinamento prevedibile, al contrario di un ordine specifico, considera l’utilizzo delle interfacce implementate da queste due classi, NavigableMap o SortedMap . Ciò ti consentirà di non divulgare implementazioni specifiche nella tua API e di passare a una di queste classi specifiche oa un’implementazione completamente diversa a volontà in seguito.

    Se una mappa immutabile soddisfa i tuoi bisogni, allora c’è una libreria di google chiamata guava (vedi anche domande su guava )

    Guava fornisce una ImmutableMap con un ordine di iterazione affidabile specificato dall’utente. Questa ImmutableMap ha prestazioni O (1) per containsKey, get. Ovviamente mettere e rimuovere non sono supportati.

    Gli oggetti ImmutableMap sono costruiti usando gli eleganti metodi di convenienza statica di () e copyOf () o un object Builder .

    LinkedHashMap restituirà gli elementi nell’ordine in cui sono stati inseriti nella mappa quando si esegue l’iterazione su keySet (), entrySet () o values ​​() della mappa.

     Map map = new LinkedHashMap(); map.put("id", "1"); map.put("name", "rohan"); map.put("age", "26"); for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } 

    Questo stamperà gli elementi nell’ordine in cui sono stati inseriti nella mappa:

     id = 1 name = rohan age = 26 

    È ansible mantenere una Map (per la ricerca rapida) e l’ List (per l’ordine) ma una LinkedHashMap potrebbe essere la più semplice. Puoi anche provare una TreeMap ad es. SortedMap , che ha qualsiasi ordine specificato.

    Non so se è opensource, ma dopo un po ‘su google ho trovato questa implementazione di Map usando ArrayList . Sembra essere pre-1.5 Java, quindi potresti volerlo generalizzare, il che dovrebbe essere facile. Nota che questa implementazione ha accesso O (N), ma questo non dovrebbe essere un problema se non aggiungi centinaia di widget al tuo JPanel, cosa che non dovresti comunque.

    Potresti provare la mia implementazione della mappa ad albero collegata .

    Ogni volta che ho bisogno di mantenere l’ordine naturale delle cose che sono conosciute in anticipo, io uso un EnumMap

    le chiavi saranno enumerate e tu puoi inserire in qualsiasi ordine tu voglia ma quando iterate itererà nell’ordine enum (l’ordine naturale).

    Inoltre, quando si utilizza EnumMap non ci dovrebbero essere collisioni che possono essere più efficienti.

    Trovo davvero che l’uso di enumMap rende il codice leggibile pulito. Ecco un esempio

    Puoi utilizzare LinkedHashMap nell’ordine di inserzione principale in Map

    I punti importanti sulla class Java LinkedHashMap sono:

    1. Contiene solo elementi unici.
    2. Una LinkedHashMap contiene valori basati sulla chiave 3. Può avere una chiave nulla e più valori nulli. 4. È come se HashMap mantenga invece l’ordine di inserimento

       public class LinkedHashMap extends HashMap implements Map 

    Ma se vuoi ordinare i valori nella mappa usando l’object definito dall’utente o qualsiasi chiave di tipo di dati primitivi, dovresti usare TreeMap Per maggiori informazioni, consulta questo link