Essa foi a minha solução usando a interface List, e o Comparator.comparing para fazer a ordenação por valor. Utilizei também a LinkedList para treinar e entender melhor outras estruturas de lista presentes no Java.
Classe de Compras:
package br.com.desafiocomprascartaodecredito.entities;
public class Shopping {
private String description;
private double value;
public Shopping(String description, double value) {
this.description = description;
this.value = value;
}
public String getDescription() {
return description;
}
public double getValue() {
return value;
}
@Override
public String toString() {
return String.format("Compra: %s (R$ %.2f)", this.description, this.value);
}
}
Classe de Cartão de Crédito:
package br.com.desafiocomprascartaodecredito.entities;
public class CreditCard {
private double limit;
public CreditCard(double limit) {
this.limit = limit;
}
public double getLimit() {
return limit;
}
public void buy(Shopping shopping) {
this.limit -= shopping.getValue();
System.out.println("Compra realizada com sucesso!");
}
public void showLimitCard() {
System.out.printf("Limite atual do cartão: R$ %.2f", this.limit);
}
}
Classe Main:
package br.com.desafiocomprascartaodecredito;
import br.com.desafiocomprascartaodecredito.entities.CreditCard;
import br.com.desafiocomprascartaodecredito.entities.Shopping;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Shopping shopping;
List<Shopping> shoppingList = new LinkedList<>();
int optionMenu = 1;
System.out.print("Informe o limite do seu cartão de crédito: ");
double limit = scanner.nextDouble();
CreditCard creditCard = new CreditCard(limit);
while (optionMenu != 0) {
System.out.print("Informe a descrição da sua compra: ");
scanner.nextLine();
String description = scanner.nextLine();
System.out.print("Informe o valor da sua compra: ");
double value = scanner.nextDouble();
shopping = new Shopping(description, value);
if(creditCard.getLimit() < value) {
System.out.println("Saldo Insuficiente");
break;
}
creditCard.buy(shopping);
shoppingList.add(shopping); // adicionando a compra na lista
System.out.print("Digite 0 para sair ou 1 para continuar: ");
optionMenu = scanner.nextInt();
}
// ordenando a lista de compras
shoppingList.sort(Comparator.comparing(Shopping::getValue));
System.out.println("**************");
System.out.println("COMPRAS REALIZADAS");
System.out.println();
for (Shopping item: shoppingList) {
System.out.printf("%s - R$ %.2f\n", item.getDescription(), item.getValue());
}
System.out.println();
System.out.println("**************");
System.out.println();
creditCard.showLimitCard();
}
}