Como manter a ordem dos elementos em hashtable
-
07-07-2019 - |
Pergunta
Eu tenho um hashtable. values ??() valores método retorna em alguns ordem diferente da ordem em que eu sou inserted.How posso obter os valores na mesma ordem que eu inserido? Usando LinkedHashMap é uma alternativa, mas não é sincronizada.
Solução
Use a LinkedHashMap
.
tabela de Hash e lista ligada implementação da interface
Map
, com ordem de iteração previsível. este difere de implementação deHashMap
em que mantém uma lista duplamente vinculada que atravessa todas as suas entradas. Esta lista ligada define a iteração ordenação, que normalmente é a ordem no qual as chaves foram inseridos no mapear ( inserção de ordem ). Observe que pedido de inserção não é afectada, se um chave é re-inserido para o mapa. (UMA chave k é reinserido um mapa m sem.put(k, v)
é invocado quandom.containsKey(k)
voltariatrue
imediatamente anterior à invocação.)
combinada com Collections.synchronizedMap()
.
Assim, por exemplo:
Map<String, String> map = Collections.synchronizedMap(
new LinkedHashMap<String, String>());
Outras dicas
Você poderia envolver uma LinkedHashMap
e sincronizar ou você pode usar o utilitário Collections.synchronizedMap
para criar uma sincronizada LinkedHashMap
:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
A partir do JavaDoc:
Se vários segmentos acessar um mapa de hash ligados simultaneamente, e pelo menos um dos modifica linhas do mapa estruturalmente, deve ser sincronizado externamente. Isso normalmente é feito através da sincronização em algum objeto que naturalmente encapsula o mapa. Se não existir um tal objecto, o mapa deve ser "enrolado" usando o método Collections.synchronizedMap. Este é o melhor feito no momento da criação, para evitar o acesso não sincronizado acidental ao mapa
Estou bastante certo de que os hashtables razão são indiferenciados é o armazenamento da ajuda e velocidade de recuperação. Devido a isso, sugiro usar uma estrutura externa para manter a ordenação e apenas usando o hashtable para armazenar valores (para pesquisa rápida).
A tabela hash é inerentemente não-ordenada, de modo que você está usando a estrutura de dados errado. Desde que você não especificar o idioma que você está usando não posso sugerir uma alternativa, mas você precisa de algum tipo de conjunto de chave / valor solicitado.
Se JDK1.6 você tem apenas dois tipo de mapa ordenado EnumMap e LinkedHashMap. Ambos não estão sincronizados. Se você só precisa se lembrar da ordem, uso
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Se você quer classificadas, em seguida, usar ConcurrentSkipListMap