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));
}
}