Java classe que implementa Mapa e mantém a ordem de inserção?
-
22-08-2019 - |
Pergunta
Eu estou procurando uma classe em java que tem associação de valores-chave, mas sem o uso de hashes. Aqui está o que eu estou fazendo atualmente:
- Adicionar valores a um
Hashtable
. - Obter um iterador para o
Hashtable.entrySet()
. - percorrer todos os valores e:
- Obter uma
Map.Entry
para o iterador. - Criar um objeto do tipo
Module
(a classe personalizada) com base no valor. - Adicione a classe a um JPanel.
- Obter uma
- Mostrar o painel.
O problema com isso é que eu não tenho controle sobre a ordem que eu recebo os valores de volta, então eu não pode exibir os valores na um determinado fim (sem embutir a ordem).
Gostaria de usar um ArrayList
ou Vector
para isso, mas mais tarde no código eu preciso pegar o objeto Module
para uma determinada chave, que eu não posso fazer com um ArrayList
ou Vector
.
Alguém sabe de uma classe / open-source livre Java que vai fazer isso, ou uma maneira de obter valores a partir de uma Hashtable
com base em quando eles foram adicionados?
Obrigado!
Solução
Sugiro um LinkedHashMap
ou um TreeMap
. A LinkedHashMap
mantém as chaves na ordem em que foram inseridos, enquanto um TreeMap
é mantido classificadas através de uma Comparator
ou a ordenação Comparable
natural dos elementos.
Uma vez que não tem que manter os elementos ordenados, LinkedHashMap
deve ser mais rápido para a maioria dos casos; TreeMap
tem um desempenho O(log n)
para containsKey
, get
, put
e remove
, de acordo com a Javadocs, enquanto LinkedHashMap
é O(1)
para cada um.
Se o seu API que somente espera uma ordem de classificação previsível, ao contrário de uma ordem de classificação específica, considere utilizar as interfaces essas duas classes implementam, NavigableMap
ou SortedMap
. Isso permitirá que você para não vazar implementações específicas em sua API e mudar para qualquer uma dessas classes específicas ou uma implementação completamente diferente à vontade depois.
Outras dicas
LinkedHashMap retornará os elementos na ordem em que foram inseridos no mapa quando você iterar sobre o conjunto de chaves (), entrySet () ou valores () do mapa.
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());
}
Isto irá imprimir os elementos na ordem em que foram colocados no mapa:
id = 1
name = rohan
age = 26
Se um mapa imutável adapta às suas necessidades , em seguida, há uma biblioteca by google chamado goiaba (ver também goiaba perguntas )
Goiaba fornece uma ImmutableMap com ordem de iteração especificado pelo usuário confiável. Este ImmutableMap tem O (1) desempenho para containsKey, obter. Obviamente colocar e remover não são suportados.
ImmutableMap objetos são construídos usando tanto os métodos de conveniência estática elegantes de () e copyOf () ou um Builder objeto.
Você pode manter um Map
(para pesquisa rápida) e List
(por ordem), mas um LinkedHashMap
pode ser a mais simples. Você também pode tentar um SortedMap
por exemplo TreeMap
, que um tem qualquer ordem que você especificar.
Eu não sei se ele é opensource, mas depois de um pouco de googling, eu encontrei esta implementação do Mapa utilizando ArrayList . Parece ser pré-1.5 Java, assim você pode querer genericize ele, que deve ser fácil. Note-se que esta implementação tem O acesso (N), mas isso não deve ser um problema se você não adicionar centenas de widgets para o JPanel, que você não deve de qualquer maneira.
Você poderia tentar Linked Árvore Mapa implementação meu.
Sempre que eu preciso para manter a ordem natural das coisas que são conhecidos antes do tempo, eu uso um EnumMap
As chaves serão enums e você pode inserir em qualquer ordem que quiser, mas quando você iterate que irá iterar na ordem de enumeração (a ordem natural).
Além disso, quando usando EnumMap não deve haver colisões que podem ser mais eficiente.
Eu realmente achar que usando enumMap faz para código legível limpa. Aqui está um exemplo
Você pode usar LinkedHashMap a ordem de inserção principal em Map
Os pontos importantes sobre classe Java LinkedHashMap são:
- Contém elementos onlyunique.
-
A LinkedHashMap contém valores com base na chave 3.It pode ter uma chave nula e vários valores nulos. 4.It é o mesmo que HashMap mantém em vez pedido de inserção
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
Mas se você quiser classificar valores no mapa usando o objeto definido pelo usuário ou qualquer outra tecla tipo de dados primitivo então você deve usar TreeMap Para obter mais informações, consulte este link