Problema para inserir em um HashMap?

9 respostas
R

fala galera preciso inserir em um hashmap a partir dos dados digitados numa JTextField,
alguem pode me ajudar, abraços a todos…

public class TelaIMC extends JFrame implements ActionListener {

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JButton btCalcular, btPesquisar, btCancelar, btLimpar;
	private JLabel lbNome,lbBuscarNome, lbIdade, lbPeso, lbAltura, lbLinha, lbCodigo, lbResultado;
	private JTextField txNome, txIdade, txPeso, txAltura, txBuscarNome, txCodigo;
	private JPanel pnDados, pnResultado;
	private String situacao = "";
	private Imc obterClassi;
	private Formatter f;
	private HashMap<Integer, Pessoa> pessoa;

	public TelaIMC(){
		
		Imc im = new Imc();
        obterClassi = im;
        
		setTitle("Calcular IMC");
		setSize(340, 340);
		
		pnDados = new JPanel();
		pnDados.setLayout(null);
		pnDados.setBounds(0, 0, 340, 190);
		pnDados.setBackground(Color.LIGHT_GRAY);
		
		pnResultado = new JPanel();
		pnResultado.setLayout(null);
		pnResultado.setBounds(0, 191, 340, 100);
		pnResultado.setBackground(Color.LIGHT_GRAY);
		
		lbNome = new JLabel(" Nome:");
		lbNome.setBounds(10, 10, 50, 20);
		lbCodigo = new JLabel(" Código:");
		lbCodigo.setBounds(250, 10, 50, 20);
		lbIdade = new JLabel(" Idade:");
		lbIdade.setBounds(250, 60, 50, 20);
		lbPeso = new JLabel(" Peso:");
		lbPeso.setBounds(10, 60, 50, 20);
		lbAltura = new JLabel(" Altura:");
		lbAltura.setBounds(130, 60, 50, 20);
		lbBuscarNome = new JLabel(" Buscar por nome:");
		lbBuscarNome.setBounds(10, 140, 120, 20);
		lbLinha = new JLabel("===========================================================");
		lbLinha.setBounds(0, 185, 340, 5);
		lbResultado= new JLabel(" Resultado");
		lbResultado.setBounds(130, 195, 120, 20);
		
		pnResultado.add(lbResultado);
		pnDados.add(lbCodigo);
		pnDados.add(lbLinha);
		pnDados.add(lbBuscarNome);
		pnDados.add(lbAltura);
		pnDados.add(lbPeso);		
		pnDados.add(lbNome);
		pnDados.add(lbIdade);
		
		txNome= new JTextField();
		txNome.setBounds(10, 30, 200, 20);
		txCodigo= new JTextField();
		txCodigo.setBounds(250, 30, 60, 20);
		txIdade= new JTextField();
		txIdade.setBounds(250, 80, 60, 20);
		txPeso= new JTextField();
		txPeso.setBounds(10, 80, 60, 20);
		txAltura= new JTextField();
		txAltura.setBounds(130, 80, 60, 20);
		txBuscarNome= new JTextField();
		txBuscarNome.setBounds(10, 160, 180, 20);
		
		pnDados.add(txCodigo);
		pnDados.add(txBuscarNome);
		pnDados.add(txAltura);
		pnDados.add(txPeso);
		pnDados.add(txNome);
		pnDados.add(txIdade);
		
		btPesquisar = new JButton("Buscar");
		btPesquisar.setBounds(200, 160, 110, 20);
		btLimpar = new JButton("Limpar");
		btLimpar.setBounds(115, 115, 90, 20);
		btCalcular = new JButton("Calcular");
		btCalcular.setBounds(10, 115, 90, 20);
		btCancelar = new JButton("Cancelar");
		btCancelar.setBounds(220, 115, 90, 20);
		
		pnDados.add(btLimpar);
		pnDados.add(btPesquisar);
		pnDados.add(btCalcular);
		pnDados.add(btCancelar);
		
		getContentPane().add(pnDados);
		getContentPane().add(pnResultado);
		
		btCalcular.addActionListener(this);
		btCancelar.addActionListener(this);
		btLimpar.addActionListener(this);
	}
	
	public void usandoHashMaps(){
		 pessoa = new HashMap<Integer, Pessoa>();
		 
		 double altura = Float.parseFloat(txAltura.getText());
		 double peso = Float.parseFloat(txPeso.getText());
		 int idade = Integer.parseInt(txIdade.getText());
		 int codigo = Integer.parseInt(txCodigo.getText());
		
		  Pessoa p = new Pessoa(txNome.getText(),codigo, idade, peso, altura);
		  
		  pessoa.put(p.getCodigo(), p);
		
	}
	
    private void calcular() {
    	try{
    		
        	double altura = Float.parseFloat(txAltura.getText());
    		double peso = Float.parseFloat(txPeso.getText());
    	    
    	    Imc i = new Imc();
    	    double imc = i.calIMC(altura, peso);
    	    i.getClassificacaoIMC(imc);   
    	    
    	    StringBuilder sb = new StringBuilder();
    	    Formatter f = new Formatter(sb, Locale.getDefault());
    	    
    	    situacao =  "         IMC :  " + f.format("%,.3f ", imc) + obterClassi.getClassificacaoIMC(imc);
    		JOptionPane.showMessageDialog( null , " "+ situacao, " IMC",
    		JOptionPane.INFORMATION_MESSAGE ); 
            setVisible( true );
            System.gc();
        	}catch(Exception e){
        		JOptionPane.showMessageDialog( this, "       Ocorreu um erro \n Forneça valores válidos \n ");    		
        	}		
	}
    
    private void limpar(){
    	txNome.setText("");
    	txIdade.setText("");
    	txPeso.setText("");
    	txAltura.setText("");
    }

    public void actionPerformed(ActionEvent acao){
    	if(acao.getSource() == btCalcular){
    		calcular();
    		System.gc();
    	}
    	else if (acao.getSource() == btCancelar){
    		System.exit(0);
    	}
    	else if(acao.getSource() == btPesquisar){
    		
    	}
    	else if(acao.getSource() == btLimpar){
    		limpar();
    	}
    }

	public static void main(String[] args) {
		TelaIMC tl = new TelaIMC();
		tl.usandoHashMaps();
		tl.setVisible(true);
		tl.setLocationRelativeTo(null);
		tl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	

}
public class Pessoa {
	
	public String nome;
	public int idade;
	public int codigo;
	public double peso;
	public double altura;
	
	public Pessoa (String nome, int codigo, int idade, double peso, double altura){
		setNome(nome);
		setIdade(idade);
		setPeso(peso);
		setAltura(altura);
		setCodigo(codigo);
		
	}
	
	
	public int getCodigo() {
		return codigo;
	}


	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}


	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getIdade() {
		return idade;
	}
	public void setIdade(int idade) {
		this.idade = idade;
	}
	public double getPeso() {
		return peso;
	}
	public void setPeso(double peso) {
		this.peso = peso;
	}
	public double getAltura() {
		return altura;
	}
	public void setAltura(double altura) {
		this.altura = altura;
	}
	
	

}

9 Respostas

E

O seu problema é que cada vez que você chama “usandoHashMaps” para inserir um novo objeto Pessoa no hashmap “pessoa” você cria um hashmap novo. Crie apenas uma vez, senão você irá ter um hashmap que tem apenas uma pessoa.

A propósito, o nome do hashmap foi mal escolhido, use alguma coisa mais descritiva como “pessoasPorCodigo” - que lhe informaria que, dado um código, você obtém uma Pessoa - ou então simplesmente “pessoas”.

R

percebí isso msm, depois q postei no forum, dei uma mudada no código, será q fica melhor assim

public class TelaIMC extends JFrame implements ActionListener {

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JButton btCalcular, btPesquisar, btCancelar, btInserir;
	private JLabel lbNome,lbBuscarNome, lbIdade, lbPeso, lbAltura, lbLinha, lbCodigo, lbResultado;
	private JTextField txNome, txIdade, txPeso, txAltura, txBuscarNome, txCodigo;
	private JPanel pnDados, pnResultado;
	private String situacao = "";
	private Imc obterClassi;
	private Formatter f;
	private HashMap<Integer, Pessoa> pessoa;

	public TelaIMC(){
		
		Imc im = new Imc();
        obterClassi = im;
        
		setTitle("Calcular IMC");
		setSize(340, 340);
		
		pnDados = new JPanel();
		pnDados.setLayout(null);
		pnDados.setBounds(0, 0, 340, 190);
		pnDados.setBackground(Color.LIGHT_GRAY);
		
		pnResultado = new JPanel();
		pnResultado.setLayout(null);
		pnResultado.setBounds(0, 191, 340, 100);
		pnResultado.setBackground(Color.LIGHT_GRAY);
		
		lbNome = new JLabel(" Nome:");
		lbNome.setBounds(10, 10, 50, 20);
		lbCodigo = new JLabel(" Código:");
		lbCodigo.setBounds(250, 10, 50, 20);
		lbIdade = new JLabel(" Idade:");
		lbIdade.setBounds(250, 60, 50, 20);
		lbPeso = new JLabel(" Peso:");
		lbPeso.setBounds(10, 60, 50, 20);
		lbAltura = new JLabel(" Altura:");
		lbAltura.setBounds(130, 60, 50, 20);
		lbBuscarNome = new JLabel(" Buscar por nome:");
		lbBuscarNome.setBounds(10, 140, 120, 20);
		lbLinha = new JLabel("===========================================================");
		lbLinha.setBounds(0, 185, 340, 5);
		lbResultado= new JLabel(" Resultado");
		lbResultado.setBounds(130, 195, 120, 20);
		
		pnResultado.add(lbResultado);
		pnDados.add(lbCodigo);
		pnDados.add(lbLinha);
		pnDados.add(lbBuscarNome);
		pnDados.add(lbAltura);
		pnDados.add(lbPeso);		
		pnDados.add(lbNome);
		pnDados.add(lbIdade);
		
		txNome= new JTextField();
		txNome.setBounds(10, 30, 200, 20);
		txCodigo= new JTextField();
		txCodigo.setBounds(250, 30, 60, 20);
		txIdade= new JTextField();
		txIdade.setBounds(250, 80, 60, 20);
		txPeso= new JTextField();
		txPeso.setBounds(10, 80, 60, 20);
		txAltura= new JTextField();
		txAltura.setBounds(130, 80, 60, 20);
		txBuscarNome= new JTextField();
		txBuscarNome.setBounds(10, 160, 180, 20);
		
		pnDados.add(txCodigo);
		pnDados.add(txBuscarNome);
		pnDados.add(txAltura);
		pnDados.add(txPeso);
		pnDados.add(txNome);
		pnDados.add(txIdade);
		
		btPesquisar = new JButton("Buscar");
		btPesquisar.setBounds(200, 160, 110, 20);
		btInserir = new JButton("Inserir");
		btInserir.setBounds(115, 115, 90, 20);
		btCalcular = new JButton("Calcular");
		btCalcular.setBounds(10, 115, 90, 20);
		btCancelar = new JButton("Cancelar");
		btCancelar.setBounds(220, 115, 90, 20);
		
		pnDados.add(btInserir);
		pnDados.add(btPesquisar);
		pnDados.add(btCalcular);
		pnDados.add(btCancelar);
		
		getContentPane().add(pnDados);
		getContentPane().add(pnResultado);
		
		btCalcular.addActionListener(this);
		btCancelar.addActionListener(this);
		btInserir.addActionListener(this);
	}
	
	public void usandoHashMaps(){
		 pessoa = new HashMap<Integer, Pessoa>();
		 
		 double altura = Float.parseFloat(txAltura.getText());
		 double peso = Float.parseFloat(txPeso.getText());
		 int idade = Integer.parseInt(txIdade.getText());
		 int codigo = Integer.parseInt(txCodigo.getText());
		
		  Pessoa p = new Pessoa(txNome.getText(),codigo, idade, peso, altura);
		  
		  pessoa.put(p.getCodigo(), p);
		
	}
	
    private void calcular() {
    	try{
    		
        	double altura = Float.parseFloat(txAltura.getText());
    		double peso = Float.parseFloat(txPeso.getText());
    	    
    	    Imc i = new Imc();
    	    double imc = i.calIMC(altura, peso);
    	    i.getClassificacaoIMC(imc);   
    	    
    	    StringBuilder sb = new StringBuilder();
    	    Formatter f = new Formatter(sb, Locale.getDefault());
    	    
    	    situacao =  "         IMC :  " + f.format("%,.3f ", imc) + obterClassi.getClassificacaoIMC(imc);
    		JOptionPane.showMessageDialog( null , " "+ situacao, " IMC",
    		JOptionPane.INFORMATION_MESSAGE ); 
            setVisible( true );
            System.gc();
        	}catch(Exception e){
        		JOptionPane.showMessageDialog( this, "       Ocorreu um erro \n Forneça valores válidos \n ");    		
        	}		
	}
    
    private void limpar(){
    	txNome.setText("");
    	txIdade.setText("");
    	txPeso.setText("");
    	txAltura.setText("");
    }

    public void actionPerformed(ActionEvent acao){
    	if(acao.getSource() == btCalcular){
    		calcular();
    		System.gc();
    	}
    	else if (acao.getSource() == btCancelar){
    		System.exit(0);
    	}
    	else if(acao.getSource() == btPesquisar){
    		
    	}
    	else if(acao.getSource() == btInserir){
    		usandoHashMaps();
    		limpar();
    	}
    }

	public static void main(String[] args) {
		TelaIMC tl = new TelaIMC();
		tl.setVisible(true);
		tl.setLocationRelativeTo(null);
		tl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	

}

agora tenho q imprimir o hash map pra ver se tah inserindo…

E

Tio, não vi a mudança. Você continua criando um novo hashmap a cada vez que vai inserir uma nova pessoa.

R

vc tem um exemplo de como criar só um hashmap?
abraços e valeu mesmo pela ajuda até aki

R

entendí sim cara, tô meio boando ainda… primeira vez usando hashmap…

E

Mova a criação do hashmap dentro do construtor dessa tela (em public TelaIMC(){ )

R

fiz isso amigo, vou continuar aki, agora tenho q buscar por nome, qq duvida aki postarei novamente, obrigado msm… abração

E

Para buscar por nome, crie um outro HashMap, cuja chave é String, não Integer. Chame esse hashmap como pessoasPorNome.

Na hora de inserir um objeto Pessoa, insira no hashmap que mapeia por códigos (pessoasPorCodigo), e também no que mapeia por nomes (pessoasPorNome).

É por isso que eu falei para chamar seu hashmap como “pessoasPorCodigo” - no seu caso, você terá também de criar um hashmap “pessoasPorNome”.

R
fiz isso, mas não busca...
public void inserePessoas(){
		 
		 double altura = Float.parseFloat(txAltura.getText());
		 double peso = Float.parseFloat(txPeso.getText());
		 int idade = Integer.parseInt(txIdade.getText());
		 int codigo = Integer.parseInt(txCodigo.getText());
		
		  Pessoa p = new Pessoa(txNome.getText(),codigo, idade, peso, altura);
		  
		  pessoaCodigo.put(p.getCodigo(), p);
		  pessoaNome.put(p.getNome(), p);
		
	}
	
	public void buscaPorNome(){
		 Pessoa p = (Pessoa) pessoaNome.get(txNome.getText());
		 
		 if ( p != null){
			 System.out.println("Nome" + p.getNome());
			 System.out.println("Idade" + p.getIdade());
			 System.out.println("Peso" + p.getPeso());
		 }
		 else
			 System.out.println("Pessoa não encontrada");
		 
		
	}
Criado 20 de junho de 2013
Ultima resposta 20 de jun. de 2013
Respostas 9
Participantes 2