Duvida sobre HashMap, urgente!

6 respostas
A

Olá pessoal, alguem pode me dar uma solução. Preciso que adicione a nova palavra no dicionário, caso ela não exista.
Mas não estou conseguindo, o que pode estar errado?

Estou fazendo apenas um teste com HashMap, aprendendo a usar.
Agradeço a colaboração dos colegas. :wink:

import java.util.HashMap;
import java.util.Scanner;


public class ProcurandoDicionario {	
	public static void main(String[] args) {
		String dig = "";
		String sig = "";
		int resp=0;		
		Scanner sc = new Scanner(System.in);
		HashMap<String, String> lista = new HashMap<String, String>(); 
		lista.put("Programar".toUpperCase(), "ato de criar um programa");  
		lista.put("Excluir".toUpperCase(), "ato de retirar algo");  
		lista.put("Ler".toUpperCase(), "Conhecer, interpretar por meio da leitura ");  
		lista.put("Visualizar".toUpperCase(),"Figurar mentalmente (algo que não se tem ante os olhos no momento)");
		
		while(resp!=3){
		  try{
				System.out.println("\n===============================\n"+
				"Digite 1 - consultar\ndigite 2 - para SAIR");
				resp = sc.nextInt();			
	      
			switch(resp){
			case 1:								
				
				System.out.println("Consulte uma palavra: \n");
				dig = sc.next();
	     	  
				String pal = lista.get(dig.toUpperCase());
					if (pal==null){
						System.out.println("Digite o siginificado");
						sig = sc.next();
						lista.put(dig, sig);
						
						
					}else{
						System.out.println("significado: " + pal);
					} 
				break;
			case 2:	      
				System.out.println("\n\nFIM DA CONSULTA");
				System.exit(0);
				break;
			default:
				System.out.println("Valor inválido");
			break;
			}
		  }catch(Exception e){
			  System.out.println("Ocorreu um erro inesperado devido a: "+
		   e.getMessage() + " => " + e + "\n\nO programa irá ser reiniciado!");
		  }finally{
			  main(args);
		  }
		}
	}
}

6 Respostas

T

O problema não é o HashMap e sim o finally dentro do while.
A busca no hashMap é feito por string exata, ao inserir o dig deve ser o mesmo tratamento da consulta o toUpperCase().

K

Use as implementações do Set porque não permitem itens repetidos.
TreeSet para Lista e TreeMap para mapas.
Ah, quando for do tipo String e Integer não precisa fazer um Comparador, se for objeto
será necessário q esse tipo de objeto implemente Comparable ou entao que vc crie uma classe que implementa o comparator
e na hora da criação dessa implementação do Set vc à passe junto.

M

O seu problema está no seu finally, sempre que você chama o metodo main todos seu objetos estão sendo instanciados novamente, o ideal seria criar um metodo auxiliar e aproveitar as instancias existentes.

Segue meu código abaixo:

import java.util.HashMap;  
import java.util.Scanner;

public class ProcurandoDicionario {	
	public static void main(String[] args) {
		
		int resp = 0;
		Scanner sc = new Scanner(System.in);
		HashMap&lt;String, String&gt; lista = new HashMap&lt;String, String&gt;(); 
		lista.put("Programar".toUpperCase(), "ato de criar um programa");  
		lista.put("Excluir".toUpperCase(), "ato de retirar algo");  
		lista.put("Ler".toUpperCase(), "Conhecer, interpretar por meio da leitura ");  
		lista.put("Visualizar".toUpperCase(),"Figurar mentalmente (algo que não se tem ante os olhos no momento)");
		
		while(resp!=3){
			resp = executaComando(sc, lista);
		}
	}
	
	private static int executaComando(Scanner sc,  HashMap&lt;String, String&gt; lista) {
		try{
			String dig = "";
			String sig = "";
			
			System.out.println("\n===============================\n"+
			"Digite 1 - consultar\ndigite 2 - para SAIR");
			int resp = sc.nextInt();			
      
			switch(resp){
				case 1:								
					System.out.println("Consulte uma palavra: \n");
					dig = sc.next();
	     	  
					String pal = lista.get(dig.toUpperCase());
					if (pal==null){
						System.out.println("Digite o siginificado");
						sig = sc.next();
						lista.put(dig.toUpperCase(), sig);
					}else{
						System.out.println("significado: " + pal);
					} 
				break;
				case 2:	      
					System.out.println("\n\nFIM DA CONSULTA");
					System.exit(0);
					break;
				default:
					System.out.println("Valor inválido");
				break;
			}
			
			return resp;
			
		  }	catch(Exception e){
				  System.out.println("Ocorreu um erro inesperado devido a: "+ 
						  e.getMessage() + " =&gt; " + e + "\n\nO programa irá ser reiniciado!");
		  }	finally{
			  
		  }
		  
		  return 0;
	}
}

Espero ter ajudado…

K

e para garantir acima de tudo, use as implementações do Set.

M

Até concordo com você, porém por muitas vezes optamos por usar Map pela sua facilidade e simplicidade.

A

Até concordo com você, porém por muitas vezes optamos por usar Map pela sua facilidade e simplicidade.

Obrigado a todos especialmente ao Murilo que corrigiu o código, bem esclarecedor!
Pode ser dado como RESOLVIDO. :stuck_out_tongue:

Criado 13 de março de 2013
Ultima resposta 13 de mar. de 2013
Respostas 6
Participantes 4