Percorrer HashTable [Resolvido]

Oi,
estou aqui tentando percorrer o conteudo do meu hashtable, criado dessa maneira:

io_ht_tabel_lexica.put("program", "1"); io_ht_tabel_lexica.put("label", "2"); io_ht_tabel_lexica.put("const", "3"); io_ht_tabel_lexica.put("var", "4");

Não sei o que esta acontecendo que na hora que estou percorrendo o hash ele muda a ordem… pegando primeiro o const depois program… etc…

estou fazendo assim:

[code]
StringBuffer ls_buf = new StringBuffer();

for(Enumeration n = io_ht_tabel_lexica.keys(); n.hasMoreElements(); ){

ls_buf.append(n.nextElement()).append('\n');
			
			JOptionPane.showMessageDialog(null,ls_buf);
		}[/code]

o que esta errado?

Tchauzin!

Olá,

Não tem nada errado…

Hashtable não mantém a ordem de seus elementos… ou seja, sempre vai mudar, não há como garantir o que sai primeiro e o que sai por ultimo!

se você quiser que eles mantenham algum tipo de ordem, você pode usar TreeMap, ou LinkedHashMap

Ou vc pode usar um SortedMap que mantem a ordem ASC das chaves , essa ordenação das chaves é uma ordenação natural

a TreeMap, como o deh sugeriu ai em cima

Aliás, eu daria outras razões para você a interface Map associada a um HashMap ou um TreeMap e não uma HashTable:

  1. Não é sincronizado. Dificilmente você vai precisar da sincronização e, quando precisar, dificilmente será na sua lista. Além disso, se sua lista realmente precisar ser sincronizada, você pode recorrer a um wrapper - Collections.synchronizedMap(seuMapa) - e deixar a parte sincronizada só nos métodos onde ela for realmente necessária. Além disso, fica também fácil alterar o código para usar uma classe realmente avançada no futuro, com as do pacote java.util.concurrent;

  2. Você pode obter as chaves, os valores ou as entradas pelos convenientes métodos keySet(), values() e entrySet(). O Set retornado é parte da collections (e não um Enumeration esquisito) e pode ser usado num for each ou copiado para qualquer outra coleção;

Por exemplo, para pegar as chaves por um índice vc poderia fazer:

  1. Não possuem métodos com significado duplicado (add e addElement, por exemplo), melhorando a legibilidade geral do código;

  2. É recomendado pela Sun.

O mesmo vale para a interface List associada a um ArrayList ou um LinkedList, ao invés do Vector.

affffff já odiei o hash!!! auiaeiaeuaeaeuiaeuaeui
Bom muito obrigado a todos!!

Acabei optanto por fazer varios if’s… hehehehehe, porque se eu foc substituir meu HashTable, eu iria ter que mudar o programa inteiro… ^^
pois estou aqui, voltando para os tempos de faculdade… e insinando meu irmão a fazer um analisador léxico e sintatico…

Resolvi assim:

if (io_hash_table.containsKey(palavraquequero)) { // Código }

=P

Tchauzin!