Estou procurando uma classe em java que tenha associação de valor-chave, mas sem usar hashes. Aqui está o que estou fazendo atualmente:
- Adicione valores a
Hashtable
. - Obtenha um iterador para o
Hashtable.entrySet()
. - Repita todos os valores e:
- Obtenha um
Map.Entry
para o iterador. - Crie um objeto do tipo
Module
(uma classe personalizada) com base no valor. - Adicione a classe a um JPanel.
- Obtenha um
- Mostre o painel.
O problema com isso é que eu não tenho controle sobre a ordem em que recebo os valores de volta, portanto não consigo exibir os valores em uma determinada ordem (sem codificar a ordem).
Eu usaria um ArrayList
ou Vector
para isso, mas mais tarde no código, preciso pegar o Module
objeto para uma determinada chave, o que não posso fazer com um ArrayList
ou Vector
.
Alguém sabe de uma classe Java de código aberto / livre que fará isso ou de uma maneira de obter valores com Hashtable
base em quando foram adicionados?
Obrigado!
java
dictionary
key-value
Shane
fonte
fonte
Respostas:
Eu sugiro um
LinkedHashMap
ou umTreeMap
. ALinkedHashMap
mantém as chaves na ordem em que foram inseridas, enquanto aTreeMap
é mantida classificada por meio de uma ordemComparator
naturalComparable
dos elementos.Como ele não precisa manter os elementos classificados,
LinkedHashMap
deve ser mais rápido na maioria dos casos;TreeMap
temO(log n)
desempenho decontainsKey
,get
,put
, eremove
, de acordo com o JavaDocs, enquantoLinkedHashMap
éO(1)
para cada um deles.Se sua API que espera apenas uma ordem de classificação previsível, em oposição a uma ordem de classificação específica, considere usar as interfaces que essas duas classes implementam,
NavigableMap
ouSortedMap
. Isso permitirá que você não vaze implementações específicas em sua API e alterne para uma dessas classes específicas ou uma implementação completamente diferente à vontade posteriormente.fonte
O LinkedHashMap retornará os elementos na ordem em que foram inseridos no mapa quando você iterar sobre keySet (), entrySet () ou valores () do mapa.
Isso imprimirá os elementos na ordem em que foram colocados no mapa:
fonte
Se um mapa imutável atende às suas necessidades , existe uma biblioteca do Google chamada goiaba (consulte também perguntas sobre goiaba )
O Guava fornece ao ImmutableMap uma ordem de iteração confiável especificada pelo usuário. Este ImmutableMap tem desempenho O (1) para containsKey, get. Obviamente, colocar e remover não são suportados.
Os objetos ImmutableMap são construídos usando os métodos estáticos elegantes de conveniência de () e copyOf () ou um objeto Builder .
fonte
Você pode manter um
Map
(para pesquisa rápida) eList
(por pedido), mas umLinkedHashMap
pode ser o mais simples. Você também pode tentar umSortedMap
exemploTreeMap
, que pode ter qualquer ordem que você especificar.fonte
Não sei se é de código aberto, mas depois de pesquisar um pouco, encontrei essa implementação do Map usando ArrayList . Parece ser Java anterior à 1.5, portanto, você pode querer generalizá-lo, o que deve ser fácil. Observe que esta implementação tem acesso O (N), mas isso não deve ser um problema se você não adicionar centenas de widgets ao seu JPanel, o que não deveria ser feito.
fonte
Você pode tentar minha implementação do Mapa de Árvore Vinculada .
fonte
Sempre que preciso manter a ordem natural das coisas conhecidas com antecedência, uso um EnumMap
as chaves serão enumeradas e você poderá inserir na ordem que desejar, mas quando 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 o uso de enumMap cria um código legível limpo. Aqui está um exemplo
fonte
Você pode usar o LinkedHashMap para a ordem de inserção principal no mapa
Os pontos importantes sobre a classe Java LinkedHashMap são:
Um LinkedHashMap contém valores com base na chave 3. Pode ter uma chave nula e vários valores nulos. 4.É o mesmo que o HashMap, mas mantém a ordem de inserção
Mas se você deseja classificar valores no mapa usando o objeto definido pelo usuário ou qualquer chave de tipo de dados primitiva, deve usar o TreeMap Para obter mais informações, consulte este link
fonte
Você pode usar
LinkedHashMap<K, V>
ou implementar seu próprio CustomMap que mantém a ordem de inserção.Você pode usar o seguinte
CustomHashMap
com os seguintes recursos:null
ou cadeias vazias não são permitidas.HashMap
vsLinkedHashMap
vsCustomHashMap
Uso de
CustomHashMap
:O / P:
Se você souber que as CHAVES estão corrigidas, poderá usar o EnumMap. Obter os valores do formulário Propriedades / arquivos XML
EX:
fonte