Objeto repetido em arraylist

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:

Valeu gente!

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.

tipo assim

if(lista_de_objetos.contains(Objeto1)){
    for(ObjetoClasse item : lista_de_Objetos ){
          if(item.getId() == Objeto1.getId()){
         item.setquantidade(item.getQuatidade+Objeto1.getQuantidade); 
          }
     }
}else{
lista_de_Objetos.add( Objeto1 );
}
1 curtida

Cara, funcionou perfeitamente. Estava quebrando a cabeça fazem dois dias nisso, e não tinha pensado na comparação: item.getId() == Objeto1.getId().

Resolvido, muito obrigado!

Só para ficar mais completo a solução, usei o nome do produto para identificar se ele já existe ou não:

	if(itemPedido.contains(itemProd)) {
		for(ItemDePedido item : itemPedido) {
			if(item.getNome() == itemProd.getNome()) {
				item.setQuantidade(item.getQuantidade() + itemProd.getQuantidade());
			}
		}
	} else {
		itemPedido.add(itemProd);
	}

isso ai, vai complementando as ideias.:smile:
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 :slight_smile:

Opa, fiz da seguinte forma:

Classe de teste:

@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 :smiley:.
Caso tenham alguma sugestão para melhorar o código, será muito bem vinda.

Valeu!

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