[RESOLVIDO] Problemas ao comparar atributos

10 respostas
Inathan

Bom dia, acho que está tudo certo nesse código, a intenção dele é não adicionar um novo objeto se já existir um igual no array, mas infelizmente está adicionando também os iguais…
Poderiam me ajudar a achar o erro?

public String adicionarProduto(Produto p) {
		String result = "";
		
		for (int i = 0; i < produtos.length; i++) {
		if(produtos[i] != null && p.equals(produtos[i])) {
				result = "Produto já cadastrado!";
				break;
				}
			}
		
		for (int x = 0; x < produtos.length; x++) {
			if(produtos[x]==null) {
				produtos[x]=p;
				result = "Produto adicionado com sucesso!";
				break;
				} 
			} 
		return result;
	}

10 Respostas

FearX

E aí, @Inathan. Tranquilo?

Eu não rodei seu exemplo (afinal ele nem compilaria aqui, falta classe Produto), mas vou chutar que o que está acontecendo é seu uso do método equals(). Primeiro: O que faz com que dois objetos sejam iguais? É uma pequena regra que você tem que pensar.

Os dois objetos produtos são iguais quando:

  1. Tem o mesmo nome? Então, a comparação é quanto aos nomes.
  2. Tem o mesmo ID? Então, a comparação é quanto aos IDs.
  3. São o mesmo objeto? Então, a comparação é quanto ao objeto.

Você precisa definir isso antes de aplicar. Depois de definido, basta sobrescrever o método equals() e você estará mais perto da sua resposta.

Só chutando o que pode ser.

[]'s!

Inathan

Obrigado pela resposta, o meu método equals compara se o nome são iguais:

public boolean equals(Produto p) {

if(p.getNome()==nome) {

return true;

}

return false;

}
FearX

Então sua regra é : "se dois produtos tiverem o mesmo nome, eles são iguais."

Então, deveria ser algo do tipo:

for (int i = 0; i < produtos.length; i++) {
if(produtos[i] != null && p.getNome().equals(produtos[i])) {
		result = "Produto já cadastrado!";
		break;
		}
	}

E eu não entendi muito bem seu método equals. Você recebe um produto e compara com uma outra variável nome, não com o atributo nome da variável p.

public boolean equals(Produto p) {
if(p.getNome()==nome) { // o que é a variável nome?
return true;
}
return false;
}
Inathan

A variável nome é um atributo da classe produto:

public class Produto {
	private String nome;
	private float preco;
	
	public Produto(String n, float p) {
		setNome(n);
		setPreco(p);
	}
	public boolean equals(Produto p) {
		if(p.getNome()==nome) {
			return true;
		}
		return false;
	}
	public String toString() {
		String result = "Nome: "+getNome()+ "\nPreço: "+ getPreco();
		return result;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public float getPreco() {
		return preco;
	}
	public void setPreco(float preco) {
		this.preco = preco;
	}
}
FearX

Faz assim: Posta todas as suas classes que podem estar relacionado com isso. Vou compilar aqui e ver, mas creio que seu problema está na lógica.

FearX

Vou me permitir marcar um usuário que manja mais que eu para te ajudar melhor. Se ele puder, ele te ajuda. Cara bacana.

@staroski

Inathan
package Parte04;

public class Produto {
	private String nome;
	private float preco;
	
	public Produto(String n, float p) {
		setNome(n);
		setPreco(p);
	}
	public boolean equals(Produto p) {
		if(p.getNome()==nome) {
			return true;
		}
		return false;
	}
	public String toString() {
		String result = "Nome: "+getNome()+ "\nPreço: "+ getPreco();
		return result;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public float getPreco() {
		return preco;
	}
	public void setPreco(float preco) {
		this.preco = preco;
	}
}

package Parte04;



public class Cardapio {
	private String titulo;
	private Produto produtos[];
	
	public Cardapio(String titu, int tamanho) {
		titulo = titu;
		produtos = new Produto[tamanho];
			
	}
	public String adicionarProduto(Produto p) {
		String result = "";
		
		for (int i = 0; i < produtos.length; i++) {
		if(produtos[i] != null && p.equals(produtos[i])) {
				result = "Produto já cadastrado!";
				break;
				}
			}
		
		for (int x = 0; x < produtos.length; x++) {
			if(produtos[x]==null) {
				produtos[x]=p;
				result = "Produto adicionado com sucesso!";
				break;
				} 
			} 
		return result;
	}
		
	
	
	public String toString() {
		String result = "";
		
		for(Produto p : produtos) {
			result += "\nNome: "+p.getNome()+"\nPreço: "+p.getPreco() ;
		}
		return result;
	}
}

package Parte04;

import java.util.Scanner;

public class ProgramaCardapio {
	public static void main(String[] args) {
		Scanner ler = new Scanner(System.in);
		
		System.out.println("Insira o título do cardápio:");
		String titulo = ler.nextLine();
		
		
		Cardapio cardapio = new Cardapio(titulo, 5);
		
		for(int x = 0; x<5; x++) {
			System.out.println("Insira o nome do produto:");
			String nome = ler.nextLine();
			System.out.println("Insira o preço do produto:");
			float preco = Float.parseFloat(ler.nextLine());
			Produto produto = new Produto(nome,preco);
			
			System.out.println(cardapio.adicionarProduto(produto));
		}
		System.out.println(cardapio.toString());
	}

}
Inathan

Vlw cara :3

staroski

Em principio o problema está na lógica do método adicionarProduto na classe Cardapio.
Se fizer dessa forma, vai funcionar:

public String adicionarProduto(Produto produto) {
    for (int i = 0; i < produtos.length; i++) {
        if (produtos[i] == null) {
            produtos[i] = produto;
            return "Produto adicionado com sucesso!";
        } else if (produtos[i].getNome().equals(produto.getNome())) {
            return "Produto já cadastrado!";
        }
    }
    return "Cardapio totalmente preenchido!";
}

Nesse exercício, não vejo necessidade de sobrescrever o método equals da classe Produto, mas se for pra sobrescrever o equals, então também tem que sobrescrever o hashcode e não basta comprar somente o nome, tem que comparar todos os atributos.
Veja:

public class Produto {

    private String nome;
    private float preco;

    public Produto(String n, float p) {
        setNome(n);
        setPreco(p);
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public float getPreco() {
        return preco;
    }

    public void setPreco(float preco) {
        this.preco = preco;
    }

    public String toString() {
        String result = "Nome: " + nome + "\nPreço: " + preco;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Produto) {
            if (this == obj) {
                return true;
            }
            Produto that = (Produto) obj;
            if (this.nome == null) {
                if (that.nome != null) {
                    return false;
                }
            } else if (!this.nome.equals(that.nome)) {
                return false;
            }
            if (Float.floatToIntBits(this.preco) != Float.floatToIntBits(that.preco)) {
                return false;
            }
            return true;
        }
        return false;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        result = prime * result + Float.floatToIntBits(preco);
        return result;
    }
}
Inathan

Muito obrigado @staroski, resolveu o problema!

Criado 26 de março de 2019
Ultima resposta 26 de mar. de 2019
Respostas 10
Participantes 3