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:

  1. Adicionar valores a um Hashtable.
  2. Obter um iterador para o Hashtable.entrySet().
  3. percorrer todos os valores e:
    1. Obter uma Map.Entry para o iterador.
    2. Criar um objeto do tipo Module (a classe personalizada) com base no valor.
    3. Adicione a classe a um JPanel.
  4. 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!

Foi útil?

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:

  1. Contém elementos onlyunique.
  2. 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

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