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;
}
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:
Tem o mesmo nome? Então, a comparação é quanto aos nomes.
Tem o mesmo ID? Então, a comparação é quanto aos IDs.
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.
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());
}
}
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;
}
}