Domanda

Ho un hashtable. Il metodo limits () restituisce valori in un ordine diverso dall'ordine in cui sono inserito. Come posso ottenere i valori nello stesso ordine in cui sono stato inserito? L'uso di LinkedHashmap è un'alternativa ma non è sincronizzato.

È stato utile?

Soluzione

Utilizza un LinkedHashMap .

  

Tabella hash ed elenco collegato   implementazione dell'interfaccia Map ,   con ordine di iterazione prevedibile. Questo   l'implementazione differisce da HashMap in   che mantiene un elenco doppiamente collegato   scorrendo tutte le sue voci.   Questo elenco collegato definisce l'iterazione   ordinamento, che normalmente è l'ordine   in cui sono state inserite le chiavi in   mappa ( ordine di inserimento ). Nota che   l'ordine di inserzione non è interessato se a   la chiave è reinserita nella mappa. (UN   la chiave k viene reinserita in una mappa m if    m.put (k, v) viene richiamato quando    m.containsKey (k) restituisce true   immediatamente prima dell'invocazione.)

combinato con Collections.synchronizedMap () .

Quindi, per esempio:

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());

Altri suggerimenti

Puoi avvolgere un LinkedHashMap e sincronizzarlo oppure puoi usare l'utilità Collections.synchronizedMap per creare un LinkedHashMap :

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

Da JavaDoc:

  

Se più thread accedono contemporaneamente a una mappa hash collegata e almeno uno dei thread modifica la mappa strutturalmente, deve essere sincronizzata esternamente. Ciò si ottiene in genere eseguendo la sincronizzazione su alcuni oggetti che incapsulano naturalmente la mappa. Se tale oggetto non esiste, la mappa dovrebbe essere "racchiusa". usando il metodo Collections.synchronizedMap. È consigliabile farlo al momento della creazione, per impedire l'accesso accidentale non sincronizzato alla mappa

Sono abbastanza sicuro che il motivo per cui gli hashtabili non sono ordinati è di aiutare la velocità di archiviazione e recupero. Per questo motivo suggerirei di utilizzare una struttura esterna per mantenere l'ordinamento e di utilizzare semplicemente la tabella hash per la memorizzazione dei valori (per una ricerca rapida).

Una tabella hash è intrinsecamente non ordinata, quindi stai usando una struttura dati errata. Dal momento che non specifichi quale lingua stai usando, non posso suggerire un'alternativa, ma hai bisogno di un tipo di set di chiavi / valori ordinati.

Se jdk1.6 hai solo due tipi di mappe ordinate EnumMap e LinkedHashMap. Entrambi non sono sincronizzati. Se hai solo bisogno di ricordare l'ordine, usa

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

se si desidera ordinare, utilizzare ConcurrentSkipListMap

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