Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

Mi solución al desafío

Compra.java

public class Compra implements Comparable {
private double monto;
private String descripcion;

public Compra(double monto, String descripcion) {
    this.monto = monto;
    this.descripcion = descripcion;
}

public double getMonto() {
    return monto;
}

public String getDescripcion() {
    return descripcion;
}

@Override
public String toString() {
    return "Compra: valor=" + monto +
            ", descripcion='" + descripcion;
}

@Override
public int compareTo(Compra otraCompra) {
    return Double.valueOf(this.monto).compareTo(Double.valueOf(otraCompra.getMonto()));
}

}


Principal.java

import java.util.Collections;
import java.util.Scanner;

public class Principal {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Escriba el límite de la tarjeta: ");
double limite = scanner.nextDouble();
scanner.nextLine();
TarjetaDeCredito tarjeta = new TarjetaDeCredito(limite);

    int opcion = 1;
    while(opcion != 0) {
        System.out.println("Escriba la descripción de la compra:");
        String descripcion = scanner.nextLine();

        System.out.println("Escriba el valor de la compra:");
        double monto = scanner.nextDouble();
        scanner.nextLine();

        if (monto <= 0) {
            System.out.println("El valor de la compra debe ser mayor que 0.");
            continue;
        }

        Compra compra = new Compra(monto, descripcion);
        boolean compraRealizada = tarjeta.lanzarCompra(compra);

        if (compraRealizada) {
            System.out.println("Compra realizada!");
            do {
                System.out.println("Escriba 0 para salir o 1 para continuar");
                opcion = scanner.nextInt();
                scanner.nextLine();
                if (opcion != 0 && opcion != 1) {
                    System.out.println("Opción inválida. Ingrese 0 o 1.");
                }
            } while (opcion != 0 && opcion != 1);
        } else {
            System.out.println("Saldo insuficiente!");
            opcion = 0;
        }
    }
    System.out.println("***********************");
    System.out.println("COMPRAS REALIZADAS:\n");
    Collections.sort(tarjeta.getListaDeCompras());
    for (Compra compra : tarjeta.getListaDeCompras()) {
        System.out.println(compra.getDescripcion() + " - " +compra.getMonto());
    }
    System.out.println("\n***********************");
    System.out.println("\nSaldo de la tarjeta: " +tarjeta.getSaldo());
}

}


TarjetaDeCredito.java

import java.util.ArrayList;
import java.util.List;

public class TarjetaDeCredito {
private double limite;
private double saldo;
private List listaDeCompras;

public TarjetaDeCredito(double limite) {
    this.limite = limite;
    this.saldo = limite;
    this.listaDeCompras = new ArrayList<>();
}

public boolean lanzarCompra(Compra compra){
    if (compra.getMonto() <= 0) {
        return false;
    }
    if(this.saldo >= compra.getMonto()){
        this.saldo -= compra.getMonto();
        this.listaDeCompras.add(compra);
        return true;
    }
    return false;
}

public double getLimite() {
    return limite;
}

public double getSaldo() {
    return saldo;
}

public List<Compra> getListaDeCompras() {
    return listaDeCompras;
}

}

1 respuesta
solución!

Hola Jhon,

Gracias por compartir tu código. Parece que has implementado una solución bastante completa para gestionar compras con una tarjeta de crédito. Aquí hay algunos comentarios y sugerencias que podrían ayudarte a mejorar o ajustar tu solución:

  1. Validación de entrada: Estás validando que el monto de la compra sea mayor que cero, lo cual es excelente. Sin embargo, también podrías considerar manejar posibles excepciones al leer entradas del usuario, como InputMismatchException, para asegurarte de que el programa no falle si el usuario ingresa un tipo de dato incorrecto.

  2. Ordenamiento de compras: Estás utilizando Collections.sort() para ordenar las compras. Esto funciona porque tu clase Compra implementa Comparable. Si en el futuro quisieras ordenar las compras por otro criterio, podrías considerar implementar un Comparator.

  3. Mensajes al usuario: Los mensajes que proporcionas al usuario son claros y útiles. Asegúrate de que todos los posibles flujos de entrada y salida sean manejados para evitar que el programa termine inesperadamente.

  4. Uso de Double.valueOf(): En el método compareTo de la clase Compra, estás utilizando Double.valueOf(). Aunque esto funciona, podrías simplificarlo usando Double.compare(this.monto, otraCompra.getMonto()), que es más directo y evita la creación de objetos innecesarios.

  5. Encapsulamiento: Tu clase TarjetaDeCredito está bien encapsulada. Sin embargo, podrías considerar hacer listaDeCompras inmutable desde fuera de la clase, devolviendo una copia de la lista en getListaDeCompras() para proteger la integridad de los datos.

Espero que estas sugerencias te sean útiles y te ayuden a mejorar aún más tu código.