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.

Foi útil?

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 de HashMap 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 se m.put(k, v) é invocado quando m.containsKey(k) voltaria true 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top