0
respostas

[Sugestão] Projeto final do desafio | Java: trabalhando com listas e coleções de dados RESOLVIDO E COMENTADO

Main.java:

package br.com.alura.desafio5;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

import br.com.alura.desafio5.model.Cartao;
import br.com.alura.desafio5.model.Compra;

public class Main {
    public static void main(String[] args) {
        //Cria um novo objeto do tipo Cartao e solicita o limite do cartão
        Cartao cartao = new Cartao();
        System.out.println("Digite o limite do cartão de crédito:");
        Scanner scanner = new Scanner(System.in);
        cartao.setLimite(scanner.nextDouble());

        //Cria uma lista utilizando interface List para armazenar as compras realizadas, e um menu para realizar as compras
        List compras = new ArrayList<>();
        int menu = 0;
        while (menu != 2) {
            System.out.println("Digite 1 para realizar uma compra ou 2 para sair:");
            menu = scanner.nextInt();
            if (menu == 1) {
                //Limpa o buffer do scanner para evitar problemas na leitura dos dados
                scanner.nextLine();
                //Cria um objeto do tipo Compra
                Compra compra = new Compra();

                //Solicita nome do produto e seta ao objeto criado acima
                System.out.println("Digite o nome do produto:");
                String nome = scanner.nextLine();
                compra.setNomeProduto(nome);

                //Solicita o valor do produto e seta ao objeto criado acima
                System.out.println("Digite o valor do produto:");
                double valor = scanner.nextDouble();
                compra.setValor(valor);

                //Realiza a compra utilizando o método 
                if(cartao.realizarCompra(compra)){
                    //Adiciona a compra à lista de compras
                    compras.add(compra);
                }
            }
        }
        //Utiliza a Classe Collections para ordenar a lista de compras. O método sort espera como parâmetro uma lista de objetos que implementam a interface Comparable. Compra implementa Comparable e sobrescreve o método compareTo.
        Collections.sort(compras);
        //Impressão da lista de compras ordenada, utilizando o toString sobrescrito
        System.out.println("Compras realizadas: \n" + compras);
    }
}

Compra.java:

package br.com.alura.desafio5.model;

public class Compra implements Comparable<Compra> {
    //Atributos da Classe
    private String nomeProduto;
    private double valor;

    //Construtores
    public Compra(String nomeProduto, double valor) {
        this.nomeProduto = nomeProduto;
        this.valor = valor;
    }
    public Compra(){}

    //Getters e Setters
    public String getNomeProduto() {
        return nomeProduto;
    }
    public void setNomeProduto(String nomeProduto) {
        this.nomeProduto = nomeProduto;
    }
    public double getValor() {
        return valor;
    }
    public void setValor(double valor) {
        this.valor = valor;
    }

    @Override
    public String toString() {
        return "Compra: %s - R$ %.2f".formatted(nomeProduto, valor);
    }
    
    //Método para comparar as compras pelo valor
    @Override
    public int compareTo(Compra arg0) {
        //Compara o valor do objeto Compra atual com o valor do objeto Compra passado como parâmetro
        //Delega a comparação para o método compare da Classe Double, que retorna - | 0 | + a depender do resultado da comparação
        return Double.compare(this.valor, arg0.valor);
    }
}

Cartao.java:

package br.com.alura.desafio5.model;

public class Cartao {
    //Atributos
    private double limite;
    private double valorGasto;

    //Construtores
    public Cartao(double limite) {
        this.limite = limite;
    }
    public Cartao(){}

    //Getters e Setters
    public double getLimite() {
        return limite;
    }
    public void setLimite(double limite) {
        this.limite = limite;
    }

    //Método que realiza a compra, verificando se o valor da compra excede o limite do cartão e retornando true ou false de acordo com o resultado da verificação
    public boolean realizarCompra(Compra compra) {
        if (compra.getValor() + valorGasto <= limite) {
            valorGasto += compra.getValor();
            System.out.println("Compra realizada com sucesso: " + compra);
            return true;
        }
        System.out.println("Compra recusada. Limite insuficiente");
        return false;
    }
}