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?
publicStringadicionarProduto(Produtop){Stringresult="";for(inti=0;i<produtos.length;i++){if(produtos[i]!=null&&p.equals(produtos[i])){result="Produto já cadastrado!";break;}}for(intx=0;x<produtos.length;x++){if(produtos[x]==null){produtos[x]=p;result="Produto adicionado com sucesso!";break;}}returnresult;}
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.
Só chutando o que pode ser.
[]'s!
Inathan
Obrigado pela resposta, o meu método equals compara se o nome são iguais:
packageParte04;publicclassCardapio{privateStringtitulo;privateProdutoprodutos[];publicCardapio(Stringtitu,inttamanho){titulo=titu;produtos=newProduto[tamanho];}publicStringadicionarProduto(Produtop){Stringresult="";for(inti=0;i<produtos.length;i++){if(produtos[i]!=null&&p.equals(produtos[i])){result="Produto já cadastrado!";break;}}for(intx=0;x<produtos.length;x++){if(produtos[x]==null){produtos[x]=p;result="Produto adicionado com sucesso!";break;}}returnresult;}publicStringtoString(){Stringresult="";for(Produtop:produtos){result+="\nNome: "+p.getNome()+"\nPreço: "+p.getPreco();}returnresult;}}
packageParte04;importjava.util.Scanner;publicclassProgramaCardapio{publicstaticvoidmain(String[]args){Scannerler=newScanner(System.in);System.out.println("Insira o título do cardápio:");Stringtitulo=ler.nextLine();Cardapiocardapio=newCardapio(titulo,5);for(intx=0;x<5;x++){System.out.println("Insira o nome do produto:");Stringnome=ler.nextLine();System.out.println("Insira o preço do produto:");floatpreco=Float.parseFloat(ler.nextLine());Produtoproduto=newProduto(nome,preco);System.out.println(cardapio.adicionarProduto(produto));}System.out.println(cardapio.toString());}}
Inathan
Vlw cara :3
staroski2 likes
Em principio o problema está na lógica do método adicionarProduto na classe Cardapio.
Se fizer dessa forma, vai funcionar:
publicStringadicionarProduto(Produtoproduto){for(inti=0;i<produtos.length;i++){if(produtos[i]==null){produtos[i]=produto;return"Produto adicionado com sucesso!";}elseif(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: