import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Introduce el límite de tu tarjeta: ");
        double limite = scanner.nextDouble();
        TarjetaCredito tarjeta = new TarjetaCredito(limite);
        while (true) {
            System.out.print("Introduce la descripción de la compra (o escribe 'salir' para terminar): ");
            String descripcion = scanner.next();
            if (descripcion.equalsIgnoreCase("salir")) {
                break;
            }
            System.out.print("Introduce el valor de " + descripcion + ": ");
            double valor = scanner.nextDouble();
            Compra compra = new Compra(descripcion, valor);
            tarjeta.agregarCompra(compra);
            System.out.print("¿Quieres continuar comprando? (1 para sí, 0 para no): ");
            int continuar = scanner.nextInt();
            if (continuar == 0) {
                break;
            }
        }
        tarjeta.mostrarResumen();
        scanner.close();
    }
}
public class Compra implements Comparable<Compra> {
    private String descripcion;
    private double valor;
    public Compra(String descripcion, double valor) {
        this.descripcion = descripcion;
        this.valor = valor;
    }
    public String getDescripcion() {
        return descripcion;
    }
    public double getValor() {
        return valor;
    }
    @Override
    public String toString() {
        return "Compra{" +
                "descripcion='" + descripcion + '\'' +
                ", valor=" + valor +
                '}';
    }
    @Override
    public int compareTo(Compra otraCompra) {
        return Double.valueOf(this.valor).compareTo(Double.valueOf(otraCompra.getValor()));
    }
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class TarjetaCredito {
    private double limite;
    private double saldo;
    private List<Compra> listaCompras;
    public TarjetaCredito(double limite) {
        this.limite = limite;
        this.saldo = limite;
        this.listaCompras = new ArrayList<>();
    }
    public void agregarCompra(Compra compra) {
        if (compra.getValor() <= saldo) {
            listaCompras.add(compra);
            saldo -= compra.getValor();
            System.out.println("Compra de " + compra.getDescripcion() + " por " + compra.getValor() + " registrada. Saldo restante: " + saldo);
        } else {
            System.out.println("Saldo insuficiente para comprar " + compra.getDescripcion() + " por " + compra.getValor());
        }
    }
    public void mostrarResumen() {
        Collections.sort(listaCompras, Comparator.comparingDouble(Compra::getValor));
        System.out.println("\nResumen de compras realizadas (de menor a mayor):");
        for (Compra compra : listaCompras) {
            System.out.println(compra.getDescripcion() + ": " + compra.getValor());
        }
        System.out.println("Saldo restante en la tarjeta: " + saldo);
    }
}