2
respostas

[Projeto] Resolução do desafio

Como era uma coisa simples, eu preferi fazer em somente um arquivo, que não ficou desorganizado, mas que contém tudo que precisa em poucas linhas e também, porque não sabia que poderia usar as váriaveis criadas em outro arquivo com o next...()

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

public class Principal {
   public static void main(String[] args) {
       Scanner leitura = new Scanner(System.in);
       int continueOrNo;

       System.out.println("Qual o limite do seu cartão de crédito?");
       double limite = leitura.nextDouble();
       leitura.nextLine();

       List<String> listaDeCompras = new LinkedList<>();
       List<Double> listaDePrecos = new LinkedList<>();


       while(true) {
           System.out.println("Qual item você deseja comprar?");
           String item = leitura.nextLine();


           System.out.println("Quanto esse item custa?");
           double preco = leitura.nextDouble();
           leitura.nextLine();

           limite = limite - preco;

           System.out.println("Deseja continuar? Se sim digite 0, se não, digite 1");
           continueOrNo = leitura.nextInt();
           leitura.nextLine();


           if (preco > limite) {
               System.out.println("Saldo insuficiente");
           } else {
               System.out.println("Compra realizada com sucesso!");
           }



           listaDeCompras.add(item);
           listaDePrecos.add(preco);
           Collections.sort(listaDePrecos);

           switch (continueOrNo) {
               case 1:
                   System.out.println("""
                           
                           ****************************
                           """);
                   System.out.println("*  COMPRAS REALIZADAS:     *");
                   System.out.println("                            ");
                   for (int i = 0; i < listaDeCompras.size(); i++) {
                       System.out.printf("*  %-15s R$ %7.2f  *%n", listaDeCompras.get(i), listaDePrecos.get(i));
                   }
                   System.out.println("                            ");
                   System.out.println("****************************");
                   System.out.println("" +
                           "Saldo restante: " + limite);
                   return;

               case 0:
                   break;
           }
       }
   }
} 
2 respostas

Seu código ficou show, mas para a questão dos produtos você passou duas listas distintas. Seria mais viável você criar um novo objeto, como uma classe Produto, e passar como atributos o nome e preço do Objeto. Exemplo:

@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.Setter(value = lombok.AccessLevel.PUBLIC)
@lombok.NoArgsConstructor(access = lombok.AccessLevel.PUBLIC)
public class Produto implements Comparable<Produto> {
    private String nome;
    private double preco;
    
    @Override
    public int compareTo(@NotNull Produto produto) {
        return Double.compare(this.preco, produto.preco);
    }
}

Isso é uma boa prática, é a questão da delegação de responsabilidade. Dessa forma, o código fica mais legível para outras pessoas, e você só precisa chamar:

List<Produto> listaDeProdutos = new LinkedList<>();

Na hora de adicionar os produtos, basta instanciar a classe Produto e adicionar na lista de produtos:

Produto produto = new Produto();
            produto.setNome(item);
            produto.setPreco(preco);
            listaDeProdutos.add(produto);

Aqui está sua classe Principal refatorada junto à classe Produto:

package org.maelys;

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

public class Principal {
    public static void main(String[] args) {

        List<Produto> listaDeProdutos = new LinkedList<>();
        Scanner leitura = new Scanner(System.in);
        int continueOrNo;

        System.out.println("Qual o limite do seu cartão de crédito?");
        double limite = leitura.nextDouble();
        leitura.nextLine();

        do {
            System.out.println("Qual item você deseja comprar?");
            String item = leitura.nextLine();

            System.out.println("Quanto esse item custa?");
            double preco = leitura.nextDouble();

            if (preco > limite || preco < 0) return;

            leitura.nextLine();
            limite = limite - preco;

            System.out.println("Deseja continuar? Se sim digite 0, se não, digite 1");
            continueOrNo = leitura.nextInt();
            leitura.nextLine();

            if (preco > limite)
                System.out.println("Saldo insuficiente");
            else
                System.out.println("Compra realizada com sucesso!");


            Produto produto = new Produto();
            produto.setNome(item);
            produto.setPreco(preco);
            listaDeProdutos.add(produto);

            Collections.sort(listaDeProdutos);

            switch (continueOrNo) {
                case 1:
                    System.out.println("""
                           
                           ****************************
                           """);
                    System.out.println("*  COMPRAS REALIZADAS:     *");
                    System.out.println("                            ");
                    for (Produto p : listaDeProdutos) {
                        System.out.println(p.getNome() + " - R$" + p.getPreco());
                    }
                    System.out.println("                            ");
                    System.out.println("****************************");
                    System.out.println(" " + "Saldo restante: " + limite);
                    return;

                case 0:
                    break;
            }
        } while (true);
    }
}

Class Produto:

package org.maelys;

import org.jetbrains.annotations.NotNull;

@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.Setter(value = lombok.AccessLevel.PUBLIC)
@lombok.NoArgsConstructor(access = lombok.AccessLevel.PUBLIC)
public class Produto implements Comparable<Produto>{
    private String nome;
    private double preco;

    @Override
    public int compareTo(@NotNull Produto produto) {
        return Double.compare(this.preco, produto.preco);
    }
}

Espero tê-lo ajudado! Ah, mais uma coisa: recomendo que comece a escrever seus códigos em inglês, que é o padrão usado pelas empresas.

A questão de criar um novo objeto para representar o produto está diretamente ligada ao conceito de Orientação a Objetos (OOP). Além disso, desse modo, a responsabilidade pela lógica de ordenação (Comparable<Produto>) fica diretamente na classe Produto, o que faz mais sentido — afinal, é ela quem deve saber como seus próprios objetos devem ser ordenados. Isso também evita misturar a lógica de ordenação com a classe Principal.

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