Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Tem como ordenar uma lista de HashMap?

Prezados, confesso que, quando vi o desafio, não pensei na possibilidade de utilizar uma Lista como atributo da Classe Cartao (na realidade, nem sabia que isso era possível), criando uma Classe Compra atrelada à lista.

Por não ver alternativas, dei uma pesquisada no uso do HashMap, que foi citado no material complementar. Cheguei a uma solução para o problema que considero "satisfatória". O único problema, na implementação que fiz, é que não consegui achar uma forma de ordenar o HashMap que construí, de acordo com o critério de valores.

Tem como ser feito?

OBS: também não criei a possibilidade do limite do Cartão ser construído no início da aplicação, pois queria me concentrar mais no problema em si. Então já criei uma clase com valor fixo no início.

2 respostas

Segue o código:

package br.com.leonhartbusiness.main;

import br.com.leonhartbusiness.models.Cartao;
import java.util.*;

public class Principal {
    public static String criaMenu() {
        return """
                ==================================================              
                              LEONHART BANK SYSTEM
                ==================================================
                SEJA BEM VINDO AO SISTEMA DE SEU CARTÃO DE CRÉDITO
                --------------------------------------------------
                                
                1 - Efetuar uma Compra
                2 - Visualizar extrato do Cartão de Crédito
                3 - Sair do Sistema
                
                Digite uma das opções acima para continuar:""";
    };

    public static void main (String[] args) {
        int opcao = 1;
        String menu = criaMenu();
        double compra = 0;
        String item = "";

        Cartao cliente1 = new Cartao(3000);
        Map<String, Double> historicoCompras = new HashMap<>();

        System.out.println(menu);

        while (opcao != 3) {
            Scanner digitaOpcao = new Scanner(System.in);

            while (!(digitaOpcao.hasNextInt())) {
                System.out.println("Opção inválida!");
                System.out.println("""
                        1 - Efetuar uma Compra
                        2 - Visualizar extrato do Cartão de Crédito
                        3 - Sair do Sistema
        
                        Digite uma das opções acima para continuar:""");
                Scanner corrigeOpcao = new Scanner(System.in);
                digitaOpcao = corrigeOpcao;
            }

            opcao = digitaOpcao.nextInt();

            switch (opcao) {

                case 1:

                    System.out.println("Item que está sendo adquirido: ");
                    Scanner descricaoCompra = new Scanner(System.in);
                    item = descricaoCompra.nextLine();

                    System.out.println("Digite o valor da Compra:");
                    Scanner valorCompra = new Scanner(System.in);
                    compra = valorCompra.nextDouble();

                    if (cliente1.getLimite() >= compra) {
                        cliente1.setLimite(cliente1.getLimite() - compra);
                        System.out.println("O saldo atualizado no cartão é de: " + cliente1.getLimite());

                        historicoCompras.put(item, compra);

                    } else {
                        System.out.println("O Limite do Cartão é insuficiente para esta compra.");
                        System.out.println("O saldo atualizado no cartão é de: " + cliente1.getLimite());
                    }

                    System.out.println(menu);
                    break;

                case 2:

                    System.out.println("""
                    ==================================================              
                                 LEONHART BANK SYSTEM
                    ==================================================
                    Segue, abaixo, seu histórico de compras:
                    --------------------------------------------------
                    """);

                    for (String itemComprado:historicoCompras.keySet()) {
                        System.out.println("Item Comprado: " + itemComprado);
                        System.out.println("Valor da Compra: " + historicoCompras.get(itemComprado));
                        System.out.println("===============================================");
                    }

                    System.out.println("O saldo atualizado no cartão é de: " + cliente1.getLimite());
                    System.out.println("\n");
                    System.out.println(menu);

                    break;

                case 3:
                    break;

                default:

                    System.out.println("Opção inválida!");
                    System.out.println("""
                        1 - Efetuar uma Compra
                        2 - Visualizar extrato do Cartão de Crédito
                        3 - Sair do Sistema
        
                        Digite uma das opções acima para continuar:""");
                    Scanner corrigeOpcao = new Scanner(System.in);
                    digitaOpcao = corrigeOpcao;

            }

        }
    }
}
package br.com.leonhartbusiness.models;

public class Cartao {
    private double limite;

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

    public double getLimite() {
        return limite;
    }

    public void setLimite(double limite) {
        this.limite = limite;
    }
}
solução!

Olá Diego!

Entendo sua dúvida. Sim, é possível ordenar uma lista de HashMap de acordo com um critério de valores. Para isso, você pode utilizar a classe Collections juntamente com a interface Comparator.

Aqui está um exemplo de como fazer isso:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<HashMap<String, Integer>> lista = new ArrayList<>();

        HashMap<String, Integer> mapa1 = new HashMap<>();
        mapa1.put("A", 5);
        mapa1.put("B", 3);
        mapa1.put("C", 8);

        HashMap<String, Integer> mapa2 = new HashMap<>();
        mapa2.put("A", 2);
        mapa2.put("B", 7);
        mapa2.put("C", 1);

        lista.add(mapa1);
        lista.add(mapa2);

        // Ordenando a lista de HashMap pelo valor da chave "B"
        Collections.sort(lista, new Comparator<HashMap<String, Integer>>() {
            @Override
            public int compare(HashMap<String, Integer> o1, HashMap<String, Integer> o2) {
                return o1.get("B").compareTo(o2.get("B"));
            }
        });

        // Imprimindo a lista ordenada
        for (HashMap<String, Integer> mapa : lista) {
            System.out.println(mapa);
        }
    }
}

Neste exemplo, a lista de HashMap é ordenada de acordo com o valor da chave "B". Você pode alterar o critério de ordenação de acordo com suas necessidades.

Espero ter ajudado e bons estudos!