Dúvida com HashMap

8 respostas
R

Boa noite pessoal…
É o seguinte, tenho um HashMap<String, String> e gostaria de saber como eu faço para fazer uma estrutura de repetição para todos os elementos dessa coleção mais ou menos assim:
Lê a chave, coloca numa String.
Lê o valor, coloca numa outra String.

Fazer isso para todos os elementos… é possível??

Obrigado desde já, Rafael.

8 Respostas

T
Map<String,String> mapa = new HashMap<String,String>();
mapa.put ("a", "1");
mapa.put ("b", "2");
for (Map.Entry<String,String> entry : mapa.entrySet())
{
    System.out.println (entry.getKey() + "-" + entry.getValue());
}
R

Muito obrigado, mas surgiu outra dúvida agora, olha:

public static void escreverGlossario(HashMap<String, String> glossario, String conceito, String significado){
        String temp = "";
        String linha;
        try{
            FileWriter fw = new FileWriter("glossario.txt");
            PrintWriter pw = new PrintWriter(fw);
            
            if(glossario.containsKey(conceito)){
                JOptionPane.showMessageDialog(null, "Esse conceito já existe.");
            }
            
            else{
            for (Map.Entry<String,String> entry : glossario.entrySet())  
            {  
            temp = String.format("%s\n%s:%s", temp, entry.getKey(), entry.getValue());  
            }  
            
            linha = String.format("%s\n%s:%s", temp, conceito, significado);
            
            pw.printf("%s\n%s", temp, linha);
            JOptionPane.showMessageDialog(null, "Conceito inserido com sucesso.");
            }
            pw.close();
    }
    
        catch(Exception e){
            JOptionPane.showMessageDialog(null, "Ocorreu um erro do tipo:"+e+"");
        }

Eu precisava que isso aí salva-se um arquivo no bloco de notas assim:

conceito1:signifcado1
conceito2:significado2
conceito3:significado3

Mas está salvando:

conceito1:signifcado1conceito2:signifcado2conceito3:signifcado3

Como eu faço para dar essa quebra de linha no bloco de notas???
Obrigado!!

F
pw.printf("%s\n%s", temp, linha + "\n");
R

Acho que não deu certo… não consegui fazer funcionar do jeito que queria.
o que significa essa mudança nessa linha de código?

ViniGodoy

Eu faria aquele for assim:

for (Map.Entry<String,String> entry : glossario.entrySet()) {     
   pw.printf("%s:%s", entry.getKey(), entry.getValue());
   pw.println();
}     
           
pw.printf("%s:%s", conceito, significado);

E eliminaria as variáveis temporárias, deixaria o código mais claro, evitaria aquela concatenão implícita usando o próprio temp no String.format e ainda usaria o println() do próprio PrintWriter, que com certeza gera o caracter de quebra de linha correto.

ViniGodoy

Ah, e não se esqueça de fechar o seu pw e seu fw num bloco finally. Senão eles podem ficar abertos caso uma exceção ocorra:

public static void escreverGlossario(Map<String, String> glossario, String conceito, String significado){
   try{
      FileWriter fw = null;
      PrintWriter pw = null;
      try {
         fw = new FileWriter("glossario.txt");
         pw = new PrintWriter(fw);
            
         if(glossario.containsKey(conceito)){
            JOptionPane.showMessageDialog(null, "Esse conceito já existe.");
            return;
          }

         for (Map.Entry<String,String> entry : glossario.entrySet()) {     
            pw.printf("%s:%s", entry.getKey(), entry.getValue());
            pw.println();
         }                
         pw.printf("%s:%s", conceito, significado);            

         JOptionPane.showMessageDialog(null, "Conceito inserido com sucesso.");
      } finally {
         if (pw != null) {
            pw.close();
         }
         if (fw != null) {
            fw.close();
         }
      }
   }  catch(Exception e) {
      JOptionPane.showMessageDialog(null, "Ocorreu um erro do tipo:"+e+"");
   }
}

PS: Alterei o tipo de entrada da função de HashMap para Map. Assim você pode receber também um TreeMap, e imprimir as chaves de maneira ordenada. :)

Tente sempre usar as classes das collections através da sua interface, nunca através de sua classe mais específica.

M

É uma ótima prática, realmente! Reduz o acoplamento, tornando o seu código menos específico, logo mais reutilizável!!!

R

Pessoal, deu tudo certo.
Muito obrigado mesmo!!

Criado 6 de agosto de 2008
Ultima resposta 7 de ago. de 2008
Respostas 8
Participantes 5