[RESOLVIDO] Problemas ao comparar atributos

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;
	}

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!

1 curtida

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;
}

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;
}

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;
	}
}

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.

1 curtida

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

1 curtida
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());
	}

}

Vlw cara :3

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;
    }
}
2 curtidas

Muito obrigado @staroski, resolveu o problema!