1
resposta

[Dúvida] Dúvida sobre uso do Map no lugar do List

Usei uma lista do tipo Map, porém a ordenação e o for eu achei que não ficaram muito legíveis. Gostaria de uma orientação para inserir a ordenação na classe ao invés de usar na principal

package br.com.alura.desafio;

import java.util.*;

public class Principal {
    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);
        System.out.println("Digite o limite do cartão:");
        double limite = leitura.nextDouble();
        CartaoDeCredito cartao = new CartaoDeCredito(limite);

        boolean compraRealizada = false;

        while (cartao.getLimite() > 0) {
            System.out.println("Digite a descrição da compra:");
            String descricao = leitura.next();

            System.out.println("Digite o valor da compra:");
            double valor = leitura.nextDouble();

            Compra compra = new Compra(descricao, valor);
            compraRealizada = cartao.compraEfetivada(compra);

            if (!compraRealizada) {
                System.out.println("Saldo insuficiente para concluir sua compra.");
                break;
            } else {
                System.out.println("Compra realizada!");
            }
            System.out.println("Digite 0 para Sair ou 1 para continuar");
            int resposta = leitura.nextInt();

            if(resposta == 0) {
                break;
            }
        }

        leitura.close();
        if(compraRealizada) {
            System.out.println("*****************************");
            System.out.println("COMPRAS REALIZADAS");
            List<Map.Entry<String, Double>> listaOrdenada = new ArrayList<>(cartao.getListaCompras().entrySet());
            listaOrdenada.sort(Map.Entry.comparingByValue());
            for(Map.Entry<String, Double> compra : listaOrdenada) {
                System.out.println(compra.getKey() + " - " + compra.getValue());
            }
            System.out.println("*****************************");
        }
        System.out.println("Saldo do cartão: " + cartao.getSaldo());
    }
}

package br.com.alura.desafio;

import java.util.*;

public class CartaoDeCredito {
    private double limite;
    private double saldo;
    private Map<String, Double> listaCompras = new HashMap<>();


    public CartaoDeCredito(double limite) {
        this.limite = limite;
        this.saldo = limite;
        this.listaCompras = new HashMap<>();
    }

    public boolean compraEfetivada (Compra compra){
        if(this.saldo > compra.getValor()) {
            this.saldo -= compra.getValor();
            listaCompras.put(compra.getDescricao(), compra.getValor());
            return true;
        } else {
            return false;
        }
    }

    public double getLimite() {
        return limite;

    }

    public double getSaldo() {
        return saldo;
    }

    public Map<String, Double> getListaCompras() {
        return listaCompras;
    }
}

package br.com.alura.desafio;

public class Compra implements Comparable<Compra> {
    private String descricao;
    private double valor;

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

    public String getDescricao() {
        return descricao;
    }

    public double getValor() {
        return valor;
    }

    @Override
    public String toString() {
        return "Compra: descricao = " + descricao + " valor = " + valor;
    }

    @Override
    public int compareTo(Compra outraCompra) {
        return Double.valueOf(this.valor).compareTo(Double.valueOf(outraCompra.valor));
    }
}

1 resposta

Oi, Cristiane! Tudo certo?

Uma boa prática é encapsular a lógica de ordenação dentro da classe que gerencia os dados. Vamos ver como podemos fazer isso.

  • Primeiro, você pode criar um método na classe CartaoDeCredito que retorna uma lista de compras ordenada. Aqui está um exemplo de como você pode fazer isso:

    public class CartaoDeCredito {
        // ... outros atributos e métodos
    
        public List<Map.Entry<String, Double>> getComprasOrdenadas() {
            List<Map.Entry<String, Double>> listaOrdenada = new ArrayList<>(listaCompras.entrySet());
            listaOrdenada.sort(Map.Entry.comparingByValue());
            return listaOrdenada;
        }
    }
    
  • Com esse método, a classe Principal pode simplesmente chamar getComprasOrdenadas() para obter a lista já ordenada:

    if(compraRealizada) {
        System.out.println("*****************************");
        System.out.println("COMPRAS REALIZADAS");
        for(Map.Entry<String, Double> compra : cartao.getComprasOrdenadas()) {
            System.out.println(compra.getKey() + " - " + compra.getValue());
        }
        System.out.println("*****************************");
    }
    

Com essa abordagem, a lógica de ordenação fica encapsulada na classe CartaoDeCredito, tornando o código na classe Principal mais limpo e fácil de entender. Espero que essa solução ajude a tornar seu código mais organizado e legível!

Espero ter ajudado e bons estudos!

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