Domanda

Sto cercando una classe in Java che ha associazione chiave-valore, ma senza l'utilizzo di hash. Qui è quello che sto facendo attualmente:

  1. Aggiungi valori a un Hashtable.
  2. Ottenere un iteratore per la Hashtable.entrySet().
  3. Scorrere tutti i valori e:
    1. Prendi un Map.Entry per l'iteratore.
    2. Crea un oggetto di tipo Module (una classe personalizzata) in base al valore.
    3. Aggiungi la classe per un JPanel.
  4. Mostra pannello.

Il problema di questo è che non ho il controllo su l'ordine che ho i valori di nuovo, quindi non posso visualizzare i valori nella un dato ordine (senza codificare l'ordine).

Vorrei usare un ArrayList o Vector per questo, ma più avanti nel codice ho bisogno di afferrare l'oggetto Module per una data chiave, che non posso fare con un ArrayList o Vector.

Qualcuno sa di un libero / open-source Java di classe che farà questo, o un modo per ottenere i valori di un Hashtable in base a quando sono stati aggiunti?

Grazie!

È stato utile?

Soluzione

Suggerisco una LinkedHashMap o un TreeMap . Un LinkedHashMap mantiene i tasti nell'ordine in cui sono stati inseriti, mentre un TreeMap viene mantenuta ordinata tramite un Comparator o Comparable naturale ordinamento degli elementi.

Dal momento che non ha bisogno di mantenere gli elementi ordinati, LinkedHashMap dovrebbe essere più veloce per la maggior parte dei casi; TreeMap ha prestazioni O(log n) per containsKey, get, put e remove, secondo il Javadocs, mentre LinkedHashMap è O(1) per ciascuno.

Se l'API che richiede solo un ordinamento prevedibile, al contrario di un ordinamento specifico, è consigliabile utilizzare le interfacce queste due classi implementano, NavigableMap o SortedMap . Questo vi permetterà di non far trapelare le implementazioni specifiche nella vostra API e passare a uno di questi corsi specifici o una completamente diversa implementazione a volontà in seguito.

Altri suggerimenti

LinkedHashMap restituirà gli elementi nell'ordine in cui sono stati inseriti nella mappa quando si scorrere i keySet (), entrySet () o valori () della mappa.

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());
}

Questo stamperà gli elementi nell'ordine in cui sono stati messi in mappa:

id = 1
name = rohan 
age = 26 

Se una mappa immutabile adatta alle vostre esigenze , quindi c'è una libreria da parte di Google chiamato guava (vedi anche )

Guava fornisce un ImmutableMap con ordine di iterazione specificato dall'utente affidabile. Questo ImmutableMap ha O (1) per le prestazioni containsKey, ottenere. Ovviamente si inserisce e rimuovi non sono supportati.

ImmutableMap oggetti sono costruiti utilizzando i metodi di convenienza eleganti statici di () e copyOf () o un Builder oggetto.

È possibile mantenere un Map (per la ricerca veloce) e List (per ordine), ma un LinkedHashMap potrebbe essere la più semplice. Si può anche provare un esempio SortedMap TreeMap, che un qualsiasi ordine hanno specificato.

Non so se è opensource, ma dopo un po 'googling, ho trovato questa implementazione di Map usando ArrayList . Sembra di essere pre-1.5 Java, quindi si potrebbe desiderare di genericize esso, che dovrebbe essere facile. Si noti che questa implementazione ha accesso alla periferia (N), ma questo non dovrebbe essere un problema se non si aggiunge centinaia di widget per il tuo JPanel, che non si deve in ogni caso.

Si potrebbe provare le mie Linked Albero Mappa implementazione.

Ogni volta che ho bisogno di mantenere l'ordine naturale delle cose che sono noti prima del tempo, io uso un EnumMap

Le chiavi saranno enumerazioni e si può inserire in qualsiasi ordine che si desidera, ma quando si scorrere Sarà iterare nell'ordine enum (l'ordine naturale).

Anche quando si utilizza EnumMap non ci dovrebbero essere le collisioni che possono essere più efficienti.

trovo davvero che l'utilizzo EnumMap rende il codice leggibile pulita. Ecco un esempio

È possibile utilizzare LinkedHashMap per ordine di inserimento principale Mappa

I punti importanti circa classe Java LinkedHashMap sono:

  1. Contiene elementi onlyunique.
  2. Un LinkedHashMap contiene valori in base alla chiave 3.It può avere una chiave nulle e più valori nulli. 4.It è stessa HashMap sostiene invece dell'ordine di inserzione

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

Ma se si vuole ordinare i valori nella cartina utilizzando oggetto definito dall'utente o un tasto qualsiasi tipo di dato primitivi quindi si dovrebbe utilizzare treemap Per ulteriori informazioni, vedere questo link

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top