Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Minha Solução] Desafio Criar Classe Compra

Para este desafio desenvolvi o código abaixo, porém não consegui realizar a listagem por valores ao final da execução, os valores não saíram corretos em relação aos produtos.


import java.util.*;

import static java.lang.System.exit;

public class Compra implements Comparable<Compra>{
    private String nomeProduto;
    private double valorProduto;
    private double limiteCartao = 1000.00;


    List<String> nome = new ArrayList<>();
    List<Double> valor = new ArrayList<>();
    Scanner sc = new Scanner(System.in);

    //Construtor
    public Compra(String nomeProduto, double valorProduto) {
        this.nomeProduto = nomeProduto;
        this.valorProduto = valorProduto;
    }

    //Sobrecarga método toString
    @Override
    public String toString() {
        return "Produto: " + this.getNomeProduto() + "( R$ " + this.getValorProduto() + ")";
    }

    //Método entrada de dados
    public void entrarDados() {
        System.out.println("===== SISTEMA DE COMPRAS =====");
        System.out.println("===== VOCÊ POSSUI SALDO DE R$ 1.000,00 =====");
        System.out.println("============================================");
        System.out.println("Bem vindo(a). Selecione a opção abaixo:");
        int selecao = 1;
        do {
            System.out.println("\n1 - REALIZAR COMPRAS");
            System.out.println("2 - SAIR");
            int opcao = sc.nextInt();
            switch (opcao) {
                case 1:
                    System.out.println("Insira o produto: ");
                    this.setNomeProduto(sc.next());
                    nome.add(this.getNomeProduto());
                    System.out.println("Insira o valor do produto: ");
                    this.setValorProduto(sc.nextDouble());
                    valor.add(this.getValorProduto());
                    System.out.println("===== COMPRAS REALIZADAS =====");
                    for (int i = 0; i < nome.size(); i++) {
                        System.out.println(i + " Produto: " + nome.get(i).toString() + " - " +
                                            "Valor: " + valor.get(i));
                    }
                    retirarValor();
                    break;
                case 2:
                    System.out.println("Saindo do programa...");
                    exit(0);
            }
        } while (selecao == 1);
    }

    //Método controla fluxo de saída valor limite
    public void retirarValor() {
        double novoValorCredito = 0;
        double acumuladorValorCompra = 0;
        for (int i = 0; i < valor.size(); i++) {
            acumuladorValorCompra = acumuladorValorCompra + valor.get(i);
            novoValorCredito = limiteCartao - acumuladorValorCompra;
        }
        System.out.println("==============================================");
        System.out.println("Valor total gasto: R$ " + acumuladorValorCompra);
        System.out.println("==============================================");

        if (acumuladorValorCompra >= 1000 || novoValorCredito <= 0 ) {
            System.out.println("Limite de R$ 1000,00 ja utilizado. Não pode fazer mais compras!");
            System.out.println("\n========================================");
            Collections.sort(nome);
            Collections.sort(valor);
            valor.sort(Comparator.comparing(Compra -> getValorProduto()));
            System.out.println("LISTANDO AS COMPRAS POR ORDEM ALFABÉTICA: ");
            System.out.println("==========================================");
            for (int i = 0; i < nome.size(); i++) {
                System.out.println(nome.get(i).toString() + " - " + valor.get(i).toString());
            }
            exit(0);
        } else {
            System.out.println("Você ainda possui créditos restante: R$ " + novoValorCredito);
            System.out.println("================================================");
        }
    }

    //getters e setters
    public String getNomeProduto() {
        return nomeProduto;
    }

    public void setNomeProduto(String nomeProduto) {
        this.nomeProduto = nomeProduto;
    }

    public double getValorProduto() {
        return valorProduto;
    }

    public void setValorProduto(double valorProduto) {
        this.valorProduto = valorProduto;
    }

    public double getLimiteCartao() {
        return limiteCartao;
    }

    public void setLimiteCartao(double limiteCartao) {
        this.limiteCartao = limiteCartao;
    }

    //SobreCarga método compareTo
    @Override
    public int compareTo(Compra outroProduto) {
        return Double.valueOf(this.valorProduto).compareTo(Double.valueOf(outroProduto.valorProduto));
    }
}

public class Principal {
    public static void main(String[] args) {
        Compra compra = new Compra("",0.0);
        compra.entrarDados();
    }
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade


Insira aqui a descrição dessa imagem para ajudar na acessibilidade


Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta
solução!

Olá, Carlos! Tudo bem?

Aparentemente o problema está na forma como você está tentando ordenar os valores dos produtos. Vamos ajustar isso. Primeiro, é importante garantir que você está utilizando corretamente o método de ordenação.

Aqui estão algumas sugestões para corrigir o problema:

  1. Armazenar Produtos e Valores Juntos: Em vez de usar duas listas separadas para nomes e valores, considere criar uma classe Produto que armazene ambos. Isso facilita a manipulação e ordenação.

  2. Classe Produto:

    public class Produto {
        private String nome;
        private double valor;
    
        public Produto(String nome, double valor) {
            this.nome = nome;
            this.valor = valor;
        }
    
        public String getNome() {
            return nome;
        }
    
        public double getValor() {
            return valor;
        }
    
        @Override
        public String toString() {
            return nome + " - " + valor;
        }
    }
    
  3. Lista de Produtos: Use uma lista de Produto em vez de listas separadas.

    List<Produto> produtos = new ArrayList<>();
    
  4. Adicionar Produto:

    produtos.add(new Produto(this.getNomeProduto(), this.getValorProduto()));
    
  5. Ordenar Produtos: Ordene a lista de produtos pelo valor.

    produtos.sort(Comparator.comparingDouble(Produto::getValor));
    
  6. Exibir Produtos:

    for (Produto produto : produtos) {
        System.out.println(produto);
    }
    

Com essas alterações, você deve conseguir listar os produtos corretamente pelo valor.

Espero que isso ajude a resolver o problema!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.