[Resolvido]Por favor, alguém poderia dizer por que o HashMap não funciona?

Boa tarde,

Será que alguém poderia me dizer a razão por que não consigo receber o objeto tipo Produto vindo da classe Principal para o método adiconaProduto(Produto p, int quantidade) da Classe CarrinhoDeCompras???

Agradeço muito se alguém me responder isso! :frowning:

 public class Principal 
{
	public static void main(String[] args) 
	{
		CarrinhoDeCompras carrinho = new CarrinhoDeCompras();
		carrinho.adicionaProduto(new Produto("livro", 123, 80.00), 10);
		carrinho.adicionaProduto(new Produto("caderno", 124, 5.00), 14);
		carrinho.adicionaProduto(new Produto("livro", 123, 100.00), 5);
	}
}

public class Produto 
{	
	private String nome;
	private int codigo;
	private double preco;
	
	public Produto(String nome, int codigo, double preco)
	{
		this.nome = nome;
		this.codigo = codigo;
		this.preco = preco;
	}
		
	public boolean equals(Object o) 
	{		
		if ((o instanceof Produto) 
				&& ((Produto) o).getCodigo() == this.getCodigo())
			return true; 
		else 
			return false; 
	}
	
	public int hashCode() 
	{ 		
		return this.getCodigo();
	}

	public String getNome() 
	{		
		return nome;
	}
	
	public void setNome(String nome) 
	{		
		this.nome = nome;
	}
	
	public int getCodigo() 
	{		
		return codigo;
	}
	
	public void setCodigo(int codigo) 
	{		
		this.codigo = codigo;
	}
	
	public double getPreco() 
	{		
		return preco;
	}
	
	public void setPreco(double preco) 
	{		
		this.preco = preco;
	}
}

import java.util.HashMap;
import java.util.Map;

public class CarrinhoDeCompras 
{	
	public Map<Produto, Integer> carrinhos = new HashMap<>();
	private int contador = 0;
	
	public void adicionaProduto(Produto p, int quantidade)
	{				
		for (Produto prod : carrinhos.keySet()) 
		{
			if(p.equals(prod))	
			{
				carrinhos.put(p, ++contador);
				System.out.println(carrinhos.get(prod));	
				System.out.println("Tem!");
			}				
			else
			{
				carrinhos.put(p, ++contador);
				System.out.println(carrinhos.get(prod));	
				System.out.println("Não tem!");
			}
		}
	}
}

Passei a manhã toda tentando descobrir isso em vão! :frowning:

Agradeço mesmo, se alguém me disser a razão do não funcionamento.

Qual erro apareceu no console?

            //Adicione essa linha. O problema eh que vc nao atualiza a variavel contador.

            if(p.equals(prod))	
			{
                                contador = carrinhos.get(prod);
                                carrinhos.put(p, ++contador);
				System.out.println(carrinhos.get(prod));	
				System.out.println("Tem!");
			}				
			else
			{       contador = 0;
				carrinhos.put(p, ++contador);
				System.out.println(carrinhos.get(prod));	
				System.out.println("Não tem!");
			}

vc nao atualiza a variavel contador.

@AndreAlcantara,

Agradeço por responder, mas independente do contador ser atualizado, ou não, quando eu chamo o método adicionaProduto(Produto p, int quantidade), e envio os parâmetros, por exemplo,

carrinho.adicionaProduto(new Produto(“livro”, 123, 80.00), 10);

não consigo receber o objeto tipo Produto!

@ juliomendes90,

Não aparece nada!

Já consegui detectar que, na verdade, o problema não está no recebimento dos parâmetros, mas sim no trecho,

    for (Produto prod : carrinhos.keySet()) 
    {
    ...
    }

Aí vem outra dúvida: Por que não estou conseguindo percorrer o HashMap???

Alguém poderia me dar uma luz, por favor???

Sua lógica está um pouco equivocada, afinal você não precisa percorrer o carrinho para verificar se o item existe:

public void adicionaProduto(Produto p, int quantidade)
{				
    if (!carrinhos.containsKey(p)) {
        System.out.println("Não Tem!");
    }				

    contador = carrinhos.get(prod) + 1;
    carrinhos.put(p, contador);
    System.out.println(contador);	
    System.out.println("Tem!");
}

Dê uma olha no método [containsKey] (https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#containsKey(java.lang.Object)) na documentação que vai te ajudar bastante e você nem precisa usar p.equals… porque se você tiver esse método sobrescrito na classe Produto, o HashMap vai utilizá-lo por você…

OBS: Fiz alguns ajustes, depois que percebi que você precisa acessar o produto de qualquer forma, aí você vai ajustando a seu modo, eu queria mostrar que você não precisa de laço para ver se o item existe… espero ter ajudado.

@LostSoldier,

Valeu, amigão, Deus lhe pague por isto!!!
Muito Obrigado!!!

Deu certo!?
Posta o trecho conosco, outras pessoas podem ter a mesma dúvida…

package diferentestiposprodutos;
import java.util.HashMap;
import java.util.Map;

public class CarrinhoDeCompras 
{	
	private int[] qtd;
	private Map<Produto, Integer> carrinho = new HashMap<>();
	private static double totalCompras = 0;
	
	public CarrinhoDeCompras()
	{
		qtd = new int[1000];
	}
	
	/*O método EQUALS() foi sobrescrito na classe Produto, então
	 * quando eu utilizo o metodo constainKey(), este método
	 * ( constainKey() ) irão fazer uso do método EQUALS() nas
	 * condições sobrescritas na classe produto;
	 * 
	 * O mesmo se aplica à sobrescrita do método EQUALS() na
	 * classe ProdutoComTamanho.*/
	
	public void adicionaProduto(Produto p, int quantidade)
	{				
		if (carrinho.containsKey(p))
		{					
			qtd[p.getCodigo()] += quantidade;
			carrinho.put(p, qtd[p.getCodigo()]);				
		}
		else
		{
			qtd[p.getCodigo()] = quantidade;
			carrinho.put(p, qtd[p.getCodigo()]);	
		}
		
		setValorTotalCompras(p, quantidade);
	}
	
	public void removeProduto(Produto p, int quantidade)
	{
		if (carrinho.containsKey(p))
		{					
			qtd[p.getCodigo()] += quantidade;
			carrinho.put(p, qtd[p.getCodigo()]);				
		}
		else
			System.out.println("Produto não existe!!!");
		setValorTotalCompras(p, quantidade);
	}
	
	public void setValorTotalCompras(Produto p, int quantidade)
	{
		totalCompras += p.getPreco()*quantidade;
	}
	
	public static double getValorTotalCompras()
	{
		return totalCompras;
	}
	
	public static void limpaValorTotalCompras()
	{
		totalCompras = 0;
	}
}

package diferentestiposprodutos;

public class Produto 
{	
	private String nome;
	private int codigo;
	private double preco;
	
	public Produto(String nome, int codigo, double preco)
	{
		this.nome = nome;
		this.codigo = codigo;
		this.preco = preco;
	}
	
	public boolean equals(Object o) 
	{		
		if ((o instanceof Produto) 
				&& ((Produto) o).getCodigo() == this.getCodigo())
			return true; 
		else 
			return false; 
	}
	
	public int hashCode() 
	{ 		
		return this.getCodigo();
	}

	public String getNome() 
	{		
		return nome;
	}
	
	public void setNome(String nome) 
	{		
		this.nome = nome;
	}
	
	public int getCodigo() 
	{		
		return codigo;
	}
	
	public void setCodigo(int codigo) 
	{		
		this.codigo = codigo;
	}
	
	public double getPreco() 
	{		
		return preco;
	}
	
	public void setPreco(double preco) 
	{		
		this.preco = preco;
	}
}

package diferentestiposprodutos;

public class ProdutoComTamanho extends Produto
{	
	private int tamanho;

	public ProdutoComTamanho(String nome, int codigo, double preco, int tamanho)
	{
		super(nome, codigo, preco);
		this.tamanho = tamanho;
	}
	
	public int getTamanho() 
	{		
		return tamanho;
	}

	public void setTamanho(int tamanho) 
	{	
		this.tamanho = tamanho;
	}
	
	public boolean equals(Object o) 
	{		
		if ((o instanceof ProdutoComTamanho) 
				&& ((ProdutoComTamanho) o).getCodigo() == this.getCodigo()
				&& ((ProdutoComTamanho) o).getTamanho() == this.getTamanho())
			return true; 
		else 
			return false; 
	}
	
	public int hashCode() 
	{ 		
		return this.getTamanho();
	}
}

package diferentestiposprodutos;

public class Principal 
{
	public static void main(String[] args) 
	{
		CarrinhoDeCompras carrinho = new CarrinhoDeCompras();
		
		//Adicionar compras Produto.
		carrinho.adicionaProduto(new Produto("livro", 124, 80.00), 10);
		carrinho.adicionaProduto(new Produto("caderno", 123, 5.00), 14);
		carrinho.adicionaProduto(new Produto("livro", 123, 100.00), 5);
		System.out.println(CarrinhoDeCompras.getValorTotalCompras());
		
		//Remover compras Produto.
		carrinho.removeProduto(new Produto("caderno", 123, 5.00), -5);
		System.out.println(CarrinhoDeCompras.getValorTotalCompras());
		
		//Adicionar compras ProdutoComTamanho.
		carrinho.adicionaProduto(new ProdutoComTamanho("bolsa", 200, 500.00, 10), 3);
		carrinho.adicionaProduto(new ProdutoComTamanho("bolsa", 200, 100.00, 10), 5);
		carrinho.adicionaProduto(new ProdutoComTamanho("tenis", 150, 50.00, 10), 4);
		System.out.println(CarrinhoDeCompras.getValorTotalCompras());
		
		//Remover compras ProdutoComTamanho.
		carrinho.removeProduto(new ProdutoComTamanho("bolsa", 200, 100.00, 10), -2);
		System.out.println(CarrinhoDeCompras.getValorTotalCompras());		
	}
}

Valeu!