Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
1
resposta

[Projeto] Desafio Compras no Cartão de Crédito

Boa tarde, tudo bem?

Queria deixar como um possível exemplo para esse projeto final o uso do StringBuilder para realizar a criação do menu.

package br.com.compras.model;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Cartao {

    private double limiteCartao;
    private List<Item> listaDeCompra;

    public Cartao(double limiteCartao) {
        this.limiteCartao = limiteCartao;
        this.listaDeCompra = new ArrayList<>();
    }

    public boolean consultaLimite(double valor) {
        return this.limiteCartao > valor;
    }

    public void fazCompra(double valor, Item item) {
        if(valor < limiteCartao) {
            this.limiteCartao -= valor;
            this.listaDeCompra.add(item);
        }
    }

    public double getLimiteCartao() {
        return limiteCartao;
    }

    public void listaItens() {
        StringBuilder sb = new StringBuilder();
        listaDeCompra.sort(Comparator.comparing(Item::getValor));
        for (Item item : listaDeCompra) {
            sb.append(item.getDescricao())
            .append(" - R$ ")
            .append(item.getValor())
            .append("\n");
        }
        
        String mensagem = """
                *******************************************
                COMPRAS REALIZADAS:

                %s

                *******************************************
                """.formatted(sb.toString());
        
        System.out.println(mensagem);
    }

}
package br.com.compras.model;

public class Item {

    private double valor;
    private String descricao;

    public Item(double valor, String descricao) {
        this.valor = valor;
        this.descricao = descricao;
    }

    public double getValor() {
        return this.valor;
    }

    public String getDescricao() {
        return this.descricao;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

}
import java.util.Locale;
import java.util.Scanner;

import br.com.compras.model.Cartao;
import br.com.compras.model.Item;

public class App {
    public static void main(String[] args) throws Exception {
        
        Scanner scanner = new Scanner(System.in).useLocale(Locale.US);

        System.out.print("Digite o limite do cartão: ");
        double limiteCartao = scanner.nextDouble();

        Cartao cartao = new Cartao(limiteCartao);
        
        boolean escolha = false;

        while (!escolha) {
            
            scanner.nextLine();
            System.out.print("Digite a descrição da compra: ");
            String descricaoCompra = scanner.nextLine();

            System.out.print("Digite o valor da compra: ");
            double valorCompra = scanner.nextDouble();

            Item item = new Item(valorCompra, descricaoCompra);

            if(!cartao.consultaLimite(valorCompra)) {
                System.out.println("Saldo Insuficiente!");
                cartao.listaItens();
                System.out.println("Saldo do cartão: " + cartao.getLimiteCartao());
                break;
            } else {
                cartao.fazCompra(valorCompra, item);
            }

            System.out.print("Digite 0 para sair ou 1 para continuar: ");
            escolha = scanner.nextInt() == 0; 
            if(escolha) {
                cartao.listaItens();
                System.out.println("Saldo do cartão: " + cartao.getLimiteCartao());
            }
        }

        scanner.close();

    }
}
1 resposta
solução!

Fala, Raphael! Tudo bom?

Agradeço por trazer sua solução para o fórum!

Curti demais como trabalhou a classe StringBuilder para montar o menu em Java, entendeu perfeitamente a importância da organização da saída formatada para deixar o programa mais legível e usou bem o Comparator para ordenar os itens de compra antes da exibição.

Algo bem legal para complementar é aplicar DecimalFormat para padronizar os valores monetários, deixando a saída mais clara. Dessa maneira:

import java.text.DecimalFormat;

DecimalFormat df = new DecimalFormat("#,##0.00");

for (Item item : listaDeCompra) {
    sb.append(item.getDescricao())
      .append(" - R$ ")
      .append(df.format(item.getValor()))
      .append("\n");
}

Isso faz com que os valores sejam exibidos sempre com duas casas decimais, no padrão brasileiro.

E algumas boas práticas que você pode adotar são:

  • Validação: garantir que o valor da compra não seja negativo.
  • Encapsulamento: manter os atributos privados e expor apenas métodos necessários.
  • Reutilização: transformar a lógica de listagem em um método que possa ser chamado em diferentes contextos.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Ah, uma pergunta: você prefere manter o foco apenas na listagem das compras ou já pensa em evoluir para incluir relatórios mais completos, como total gasto e percentual do limite utilizado?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!