1
resposta

[Projeto] Minha (quase) resolução

Inicialmente eu optei por adaptar o desafio para utilizar o HashMap, que eu não tinha praticado ainda, entretanto, no decorrer da resolução identifiquei que na Classe HashMap não há o metódo sort() ou semelhante, impedindo a ordenação das compras por um critério específico, nesse caso do projeto o PREÇO.

Pesquisei e percebi que teria que converter o HashMap para uma List. Há alguma outra forma de resolver isso?

Segue a resolução para o restante das propostas:

package br.com.alura.screenmatch.atividadeslistas.capitulo5;

public class Cartao {
    private String nome;
    private String bandeira;
    private double limite;

    public String getNome() {
        return nome;
    }

    public String getBandeira() {
        return bandeira;
    }

    public double getLimite() {
        return limite;
    }

    public Cartao(String nome, String bandeira, double limite) {
        this.nome = nome;
        this.bandeira = bandeira;
        this.limite = limite;
    }

    @Override
    public String toString() {
        return "Nome do cartão:'" + nome + '\'' +
                ", Bandeira: '" + bandeira + '\'' +
                ", Limite: R$" + limite;
    }

    public boolean realizaCompra(double valorCompra){

        if (this.limite >= valorCompra){
            limite -= valorCompra;
            System.out.println("Compra realizada! Valor atualizado do limite: R$ " + this.limite) ;
            return true;
        } else {
            System.out.println("Saldo insuficiente! Valor do limite disponível: R$ " + this.limite);
            return false;
        }
    }
}
package br.com.alura.screenmatch.atividadeslistas.capitulo5;

import java.util.*;

public class Principal5 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //List<String> listaDeCompras = new ArrayList<>();
        Map<String, Double> listaDeCompras = new HashMap<>();
        int opcaoSelecionada = 0;
        double valorTotal = 0;

        System.out.println("Insira os dados do seu cartão (nome, bandeira, limite): ");
        Cartao cartao1 = new Cartao(scanner.nextLine(), scanner.nextLine(), scanner.nextDouble());


        while (opcaoSelecionada != 4){
            System.out.println("""
                Bem-vindo a sua carteira digital. Escolha uma opção:
                1. Realizar compras
                2. Visualizar cartão
                3. Visualizar compras
                4. Sair""");

            opcaoSelecionada = scanner.nextInt();
            scanner.nextLine();
            switch (opcaoSelecionada){
                case 1:
                    System.out.println("O que deseja comprar?");
                    String item = scanner.nextLine();
                    System.out.println("Qual o valor da compra?");
                    double valorCompra = scanner.nextDouble();

                    if (cartao1.realizaCompra(valorCompra)){
                        listaDeCompras.put(item, valorCompra);
                        valorTotal += valorCompra;
                    }
                    break;
                case 2:
                    System.out.println(cartao1);
                    break;
                case 3:
                    for (String chave : listaDeCompras.keySet()){
                        System.out.println("Descrição da compra: " + chave +
                                ", Valor da compra: R$ "+ listaDeCompras.get(chave));
                    }
                    System.out.println("Valor total: R$ " + valorTotal);
                    break;
                case 4:
                    System.out.println("Operação finalizada.");
                    break;
                default:
                    System.out.println("Opção inválida! Tente novamente");
                    break;
            }
        }
    }
}
1 resposta

Olá André. Tudo bem?

Você está no caminho certo ao tentar usar um HashMap para armazenar suas compras, mas como você percebeu, o HashMap não mantém a ordem dos elementos e não possui um método de ordenação direta. Para ordenar suas compras pelo preço, você pode seguir uma abordagem que envolve a conversão dos dados para uma estrutura que permita a ordenação.

Vou deixar essa sugestão de como você pode fazer isso:

  1. Você pode usar o método entrySet() do HashMap para obter um conjunto de entradas (pares chave-valor), que pode ser convertido em uma lista.

  2. Uma vez que você tenha uma lista de entradas, pode usar o método sort() da classe Collections ou o método sort() da própria lista, fornecendo um comparador que compara os valores (preços) das entradas.

  3. Após a ordenação, você pode iterar sobre a lista de entradas e exibir as compras na ordem desejada.

Aqui está um exemplo de como isso pode ser implementado no seu código:

case 3:
    List<Map.Entry<String, Double>> listaOrdenada = new ArrayList<>(listaDeCompras.entrySet());
    listaOrdenada.sort(Map.Entry.comparingByValue());

    for (Map.Entry<String, Double> entrada : listaOrdenada) {
        System.out.println("Descrição da compra: " + entrada.getKey() +
                ", Valor da compra: R$ " + entrada.getValue());
    }
    System.out.println("Valor total: R$ " + valorTotal);
    break;

Neste exemplo, Map.Entry.comparingByValue() é usado para criar um comparador que ordena as entradas com base nos valores (preços).

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos