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.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
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!