Boa noite, sou novo no forum!!
Pessoal tenho arraylist de produtos e na hora que removo um que está na posição 0
o que está na posição 1, passa pra 0
e não pode acontecer isso, pois é uma lista de produtos
exemplo depois no scanner o o usuario vai la digitar la referenciando o que estava na posição 1 e estoura uma exceção:
IndexOutOfBoundsException: Index 1 out of bounds for length 1
pq ele poe la , exemplo: codigo 1 e não tem mais, sendo que o array passa pra 0
obs é um exercicio do curso
método
public void removerQuantidadePraVenda(int quantidade, int codigo) throws QuantidadeInsuficienteException {
var codigoProduto = codigo-1;
if (getListaDosprodutos().get(codigoProduto).getQuantidade() > quantidade){
this.quantidade -= 1;
}else if (getListaDosprodutos().get(codigoProduto).getQuantidade() == 1) {
getListaDosprodutos().remove(codigoProduto);
} else {
throw new QuantidadeInsuficienteException();
}
}
nos parametros do metodo entra uma variavel do scanner la na main, como podem ver eu coloquei um -1 pra justamente na hora que for digitado 1 no scanner, ele subtrair 1 e referenciar a posição 0, ou seja a certa e assim adiante.
Isso é um comportamento padrão de Lists.
Uma alternativa é usar um SortedMap com os índices como keys.
Ou mostrar pro usuário os novos índices e fazer uma verificação (com base no tamanho da lista) da validade do índice: “Esse índice não existe”
Com qual das alternativas?
Seguindo a sugestão de SortedMap, você trocaria a sua lista de produtos por um Map de produtos.
Map<Integer, Produto> produtos = new TreeMap<>();
O método de adicionar um produto ficaria algo como:
//Vou usar o tamanho do Map como novo índice, vc pode pensar em outra lógica
produtos.put(produtos.size() + 1, produto);
E para pegar um produto do mapa:
produtos.get(indice); //Esse método retorna null se não encontrar o produto, verifique isso
e como pegaria todos os produtos do mapa ?
pq eu precisaria digitar um scanner exemplo 3, para abrir a listagem de todos os produtos
.
consultar apenas um eu consegui que foi:
public void consultarProdutos(){
System.out.println("Digite o codigo do produto que deseja consultar!");
var scanner = new Scanner(System.in);
var codigoInserido = scanner.nextInt();
System.out.println("");
var a = getListaDosprodutos().get(codigoInserido); //utilizando o map
// getListaDosprodutos().stream().filter(p -> p.getCodigo() == codigoInserido).forEach(p -> System.out.println(p)); // utilizando list, coloquei como comentario pra utilizar o map
System.out.println(a);
}
Tem o values(), retornando uma Collection de Produtos
entrySet() retorna um Set de Map.Entry<Integer, Produto>
, com ele vc pega o índice (getKey()
) e o Produto (getValue()
) correspondente
fiz um for e consegui. acho que ja volto com mais duvidas kkk
1 curtida
Ei criei um
Private Map<Integer, Produto> listaDosprodutos = new TreeMap<>();
pra guardar os produtos , isso esta na minha classe Produtos
e criei um private Map<LocalDate, Produto> registroDeVenda = new TreeMap<>();
na classe Venda pra guardar minhas vendas
ai no caso
eu pesquisaria a o periodo da venda atraves do localdate
tentei utilizar um groupingby mas nao consegui
ai consegui utilizando o get e puxando a key que foi um localdate
public void listagemPorPeriodo(LocalDate str){
System.out.println("************Listagem Por Periodo Detalhado************");
System.out.println("");
if (getRegistroDeVenda().isEmpty()){
System.out.println("Não á vendas neste periodo");
}else {
System.out.println("");
System.out.println("O Produto vendido no periodo: " + str + ", Foi: ");
var a = getRegistroDeVenda().get(str);
System.out.println(a);
}
}
o produto no map de “lista dos produtos da classe produtos” tem quantidade.
dai eu adiciono esse produto no map de “registro de venda da classe Venda”
e depois eu removo uma quantidade pra venda la na main, referenciando o produto que ta no map lista dos produtos
so que depois quando eu busco o map da classe venda, aparece la o produto com a quantidade 0
sendo que era pra tá com a quantidade que foi vendida, no caso 1. dai
aparece assim
“O Produto vendido no período: 2020-06-28, Foi:
Código: 1, Nome: 1, Valor: 1.0, Quantidade: 0”
era pra quantidade vir 1
não sei se me expressei muito bem, mas obrigado desde já
Como você tá guardando os produtos no registro de vendas?
Se for salvar outro produto na mesma data, vai apagar o anterior, pq a key vai ser a mesma.