Actualmente estoy tratando de escribir un método que primero solicite un depósito, retiro o renuncia.

Luego solicite el nombre de la cuenta (esto busca la cuenta de la lista de la matriz por el nombre)

Luego solicite un monto para el depósito o retiro seleccionado.

Luego regrese a la indicación (depositar, retirar, abandonar)

El código que he escrito está en el orden incorrecto. (Pide el nombre, luego la acción, luego la cantidad), y no puedo averiguar cómo cambiarlo al orden deseado arriba.

Tampoco puedo averiguar cómo hacer que el ciclo se cierre con una entrada de 3.

Creo que estoy cerca ... parece que no puedo avanzar desde aquí. (ps, el bucle while verdadero es solo un bucle temporal que estaba usando mientras trataba de descubrir el resto)

public void banking()
{
    while(true)
    {          
        Scanner scan4 = new Scanner(System.in);
        System.out.println("please enter the name for the account"); //takes the name of the account to select the correct object in arraylist
        String accountName = scan4.nextLine();

        for(Account y: accounts)                                    //for all the objects in the arraylist...
        {
            while(accountName.equalsIgnoreCase(y.getName()))
            {
                Scanner scan3 = new Scanner(System.in);
                System.out.println("1:Deposit   2:Withdraw  3:Quit");
                int request = scan3.nextInt();

                if(request == 1)
                {
                    Scanner scan = new Scanner(System.in);
                    System.out.println("please make a deposit");
                    double newBalance = scan.nextDouble();
                    y.deposit(newBalance);
                }

                else if (request == 2)
                {
                    Scanner scan2 = new Scanner(System.in);
                    System.out.println("please make a withdrawl");
                    double withdrawl = scan2.nextDouble();

                    if(withdrawl > y.getBalance())
                    {
                        System.out.println("Insufficient funds");
                    }
                    else
                    {
                        y.withdraw(withdrawl);
                    }
                }
                else if (request == 3)
                {
                   break;
                }
            }
        }
    }
}
1
tom 10 sep. 2018 a las 14:44

3 respuestas

La mejor respuesta

Supongo que solo desea cambiar el orden a lo siguiente:

  1. Acción (depositar, retirar, abandonar)
  2. Nombre de la cuenta
  3. Cantidad (solo depositar / retirar)

Esto se puede lograr fácilmente escaneando la acción al comienzo del método. Entonces solo tienes que mover esta parte al comienzo de tu wile-loop:

Scanner scan3 = new Scanner(System.in);
System.out.println("1:Deposit   2:Withdraw  3:Quit");
int request = scan3.nextInt();

Además, debe cambiar su second while-loop a una declaración if. De lo contrario, el bucle no se detendrá una vez que lo haya ingresado, y no sería posible elegir una acción diferente.

Así que cambia esto:

while(accountName.equalsIgnoreCase(y.getName()))

A esto:

if(accountName.equalsIgnoreCase(y.getName()))

Entonces el código corregido se vería así:

public void banking()
{
    while(true)
    {
    Scanner scan3 = new Scanner(System.in);
    System.out.println("1:Deposit   2:Withdraw  3:Quit");
    int request = scan3.nextInt();

    Scanner scan4 = new Scanner(System.in);
    System.out.println("please enter the name for the account"); //takes the name of the account to select the correct object in arraylist
    String accountName = scan4.nextLine();

    for(Account y: accounts)                                    //for all the objects in the arraylist...
    {
        if(accountName.equalsIgnoreCase(y.getName()))
        {
            if(request == 1)
                {
                    Scanner scan = new Scanner(System.in);
                    System.out.println("please make a deposit");
                    double newBalance = scan.nextDouble();
                    y.deposit(newBalance);
                }

            else if (request == 2)
                {
                    Scanner scan2 = new Scanner(System.in);
                    System.out.println("please make a withdrawl");
                    double withdrawl = scan2.nextDouble();

                    if(withdrawl > y.getBalance())
                        {
                            System.out.println("Insufficient funds");
                        }
                    else
                        {
                            y.withdraw(withdrawl);
                        }


                }

            else if (request == 3)
                {
                   break;
                }
        }
    }
    }
}

También se pueden realizar mejoras adicionales para la eficiencia. Por ejemplo, evitando el bucle for si el usuario eligió "salir". (pero esto es opcional y no necesario)

Aunque esto resolvería su problema, debo decirle que nunca debe usar true como condición para un ciclo while.

0
npkllr 10 sep. 2018 a las 12:19

Según su código, entiendo que accounts es un arrayList de Account.

Si es así, puede eliminar esta condición while

while(accountName.equalsIgnoreCase(y.getName()))
        {

Y use if en su lugar

if(accountName.equalsIgnoreCase(y.getName()))
        {

Este puede ser uno de los puntos para la reestructuración.

0
Raj 10 sep. 2018 a las 12:02

Puede utilizar switch() de esta manera:

interface Account {
    String getName();

    BigDecimal getBalance();

    void deposit(BigDecimal value);

    void withdraw(BigDecimal value);
}

enum Action {
    DEPOSIT(1),
    WITHDRAW(2),
    QUIT(3),
    UNRECOGNIZED(0);

    private final int value;

    Action(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public static Action getAction(int value) {
        for (Action action : Action.values()) {
            if (action.getValue() == value) {
                return action;
            }
        }
        return UNRECOGNIZED;
    }
}

private static Account getAcc(List<Account> accounts, String acc) {
    return accounts.stream().filter(account -> account.getName().equalsIgnoreCase(acc)).findFirst()
            .orElseThrow(RuntimeException::new);
}

public static void banking(List<Account> accounts) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("please enter number for given action:");
    System.out.println("1 - : deposit");
    System.out.println("2 - : withdraw");
    System.out.println("3 - : quit");

    Action action = Action.getAction(scanner.nextInt());

    if (Action.QUIT == action){
        System.out.println("quiting ...");
        return;
    }


    System.out.println("please enter the name for the account");
    String accountName = scanner.nextLine();
    Account account = getAcc(accounts, accountName);

    switch (action) {
    case WITHDRAW:
        System.out.println("please make a withdrawl");
        BigDecimal withdrawl = new BigDecimal(scanner.nextDouble());
        if (withdrawl.compareTo(account.getBalance()) > 0) {
            System.out.println("Insufficient funds");
        } else {
            account.withdraw(withdrawl);
        }
        break;
    case DEPOSIT:
        System.out.println("please make a deposit");
        BigDecimal newBalance = new BigDecimal(scanner.nextDouble());
        account.deposit(newBalance);
        break;
    default:
        break;
    }
}
0
Rob 10 sep. 2018 a las 13:31