Classe Java que implementa o Mapa e mantém a ordem de inserção?

Estou procurando uma class em java que tenha associação de valor-chave, mas sem usar hashes. Aqui está o que eu estou fazendo atualmente:

  1. Adicione valores a uma Hashtable .
  2. Obtenha um iterador para o Hashtable.entrySet() .
  3. Iterar todos os valores e:
    1. Obter um Map.Entry para o iterador.
    2. Crie um object do tipo Module (uma class personalizada) com base no valor.
    3. Adicione a class a um JPanel.
  4. Mostrar o painel

O problema com isso é que eu não tenho controle sobre a ordem que recebo os valores de volta, por isso não posso exibir os valores em uma determinada ordem (sem codificar a ordem).

Eu usaria um ArrayList ou Vector para isso, mas depois no código eu preciso pegar o object Module para uma determinada chave, o que eu não posso fazer com um ArrayList ou Vector .

Alguém sabe de uma class Java livre / de código aberto que fará isso, ou uma maneira de obter valores de uma Hashtable base em quando eles foram adicionados?

Obrigado!

Eu sugiro um LinkedHashMap ou um TreeMap . Um LinkedHashMap mantém as chaves na ordem em que foram inseridas, enquanto um TreeMap é mantido classificado através de um Comparator ou a ordenação natural Comparable dos elementos.

Como não é necessário manter os elementos classificados, o LinkedHashMap deve ser mais rápido na maioria dos casos; TreeMap tem O(log n) desempenho O(log n) para containsKey , get , put e remove , de acordo com os Javadocs, enquanto o LinkedHashMap é O(1) para cada um.

Se sua API que espera apenas uma ordem de sorting previsível, em vez de uma ordem de sorting específica, considere usar as interfaces que essas duas classs implementam, SortedMap ou SortedMap . Isso permitirá que você não vaze implementações específicas em sua API e mude para uma dessas classs específicas ou uma implementação completamente diferente à vontade depois.

Se um mapa imutável se encheckbox em suas necessidades, então existe uma biblioteca do google chamado goiaba (veja também perguntas sobre goiaba ).

A Guava fornece um ImmutableMap com uma ordem confiável de iteração especificada pelo usuário. Este ImmutableMap tem o desempenho O (1) para containsKey, get. Obviamente, colocar e remover não são suportados.

Os objects ImmutableMap são construídos usando os methods de conveniência estáticos elegantes de () e copyOf () ou um object Builder .

LinkedHashMap retornará os elementos na ordem em que foram inseridos no mapa quando você fizer iteração nos keySet (), entrySet () ou values ​​() do mapa.

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

Isso imprimirá os elementos na ordem em que foram colocados no mapa:

 id = 1 name = rohan age = 26 

Você pode manter um Map (para pesquisa rápida) e uma List (por ordem), mas um LinkedHashMap pode ser o mais simples. Você também pode tentar um SortedMap por exemplo SortedMap , que tem qualquer ordem que você especificar.

Eu não sei se é opensource, mas depois de um pouco de googling, encontrei essa implementação do Map usando ArrayList . Parece ser pré-1.5 Java, então você pode querer generalizá-lo, o que deve ser fácil. Note que esta implementação tem access O (N), mas isso não deve ser um problema se você não adicionar centenas de widgets ao seu JPanel, o que você não deve de qualquer maneira.

Você poderia tentar minha implementação de Mapa de Árvore Vinculado .

Sempre que eu preciso manter a ordem natural das coisas que são conhecidas antes do tempo, eu uso um EnumMap

as chaves serão enums e você pode inserir na ordem que quiser, mas quando você iterar iterará na ordem enum (a ordem natural).

Além disso, ao usar o EnumMap, não deve haver colisões que possam ser mais eficientes.

Eu realmente acho que usando enumMap faz para código legível limpo. Aqui está um exemplo

Você pode usar o LinkedHashMap para o pedido principal de veiculação no Mapa

Os pontos importantes sobre a class Java LinkedHashMap são:

  1. Contém apenas elementos únicos.
  2. Um LinkedHashMap contém valores com base na chave 3.Pode ter uma chave nula e vários valores nulos. 4.Ele é o mesmo que o HashMap, em vez disso, mantém o pedido de inserção

     public class LinkedHashMap extends HashMap implements Map 

Mas se você quiser classificar os valores no mapa usando o object definido pelo usuário ou qualquer chave de tipo de dados primitiva, então você deve usar o TreeMap. Para obter mais informações, consulte este link