Pessoal, tenho um código onde se um item repetido(no caso o objeto idp do ItemDePedido), ele deve incrementar a quantidade do ItemDePedido. Mas mesmo instanciando várias vezes ele não soma a quantidade. Alguém teria uma luz?
Segue o link das classes para melhor visualização:
o código não ta carregando rs. Era melhor copiar e colar com essa tag ‘</>’
mas já da pra resolver. é só você percorrer a lista e busca quem possui o id igual, ou o hashcode, colocando a condicional if, se for igual soma o atributo quantidade.
isso ai, vai complementando as ideias.
pra vc treinar, vou te fzr um desafio blz? que tal adicionar um valor em dinheiro pra esses objetos e então imprimir o valor total da array list, se estiver fácil, faça o valor total de cada item na lista.
Exemplo: lista= 80 reais em produtos , Objeto= 2 reais por unidade/ valor Total Objeto= 6 reais
bons estudo
@Test
void testaPedido12() {
double esperado;
Pedido p = new Pedido();
ItemDePedido idp = new ItemDePedido();
ItemDePedido idp2 = new ItemDePedido();
ItemDePedido idp3 = new ItemDePedido();
p.setValorTotalPermitido(2000);
idp.setNome("monitor");
idp.setPreco(153.33);
idp.setQuantidade(2);
idp2.setNome("fonte");
idp2.setPreco(219.02);
idp2.setQuantidade(3);
idp3.setNome("calculadora");
idp3.setPreco(113.00);
idp3.setQuantidade(3);
p.acrescentaItem(idp);
p.acrescentaItem(idp2);
p.acrescentaItem(idp3);
p.retiraItem("fonte");
esperado = p.getTotal();
assertEquals(645.66, esperado, 0.01);
}
Aqui estou adicionando 3 itens com quantidades e preços diferentes, depois removo um deles com a solução no tópico acima, e depois testo o valor esperado pelo método getTotal().
Implementação do método getTotal, no qual usei um for simples pra percorrer, pegando o preço de cada produto e multiplicando pela quantidade:
public double getTotal() {
double vlTotal = 0;
for(int i = 0; i < itemPedido.size(); i++) {
vlTotal = vlTotal + (itemPedido.get(i).getPreco() * itemPedido.get(i).getQuantidade());
}
return vlTotal;
}
Um bônus caso alguém também precise, a implementação do método para remover, retiraItem(), que recebe o nome do item e caso ele não seja encontrado lança uma exceção:
public void retiraItem(String nome) {
boolean exist = false;
int indiceRemovido = 0;
for(int i = 0; i < itemPedido.size(); i++) {
if(itemPedido.get(i).getNome().equals(nome)) {
exist = true;
indiceRemovido = i;
break;
}
}
if(exist) {
itemPedido.remove(indiceRemovido);
} else {
throw new RuntimeException("Item não encontrado no pedido");
}
}
Obs: nesse me bati um pouco para lançar a exceção apenas quando não existisse. Estava tendo o problema pq ele não estava percorrendo o IF, solucionei tirando o método itemPedido.remove() de dentro do FOR e cirei um boolean pra ele cair em outro IF.
Desculpa se ficou um pouco longo, mas espero que possa ajudar alguém também .
Caso tenham alguma sugestão para melhorar o código, será muito bem vinda.
Muito bom, vc pode trocar esse for(int i =0; i>), por simplesmente for (ClasseDoItem item : listaDeItens), esse recurso se chama foreach, vc tbm pode fzr; ListaDeItem.foreach(item -> {//código
});