Vale, pues olvídate de la clase
Pair, no la necesitas.
De hecho, creo que estás haciendo una implementación más complicada de lo que estaría pidiendo el enunciado.
Yo la clase
CuentaBancaria la escribiría un poco distinta.
Tu método
getDatosCuenta() me parece demasiado complicado al retornar un List de Strings. Si su propósito va a ser simplemente mostrar en pantalla los datos de la cuenta, podemos solucionarlo construyendo un único String con todos esos datos.
Con
String.format() se puede hacer de forma sencilla y además hará el redondeo del valor double sin tener que recurrir a otras clases.
El método
realizarTransferencia(). Como este método pertenece a la clase
CuentaBancaria,es decir, lo vamos a invocar desde un objeto de dicha clase, no es necesario que reciba además dos objetos
CuentaBancaria como argumentos entre paréntesis.
Bastaría con recibir uno, que será la cuenta "destino" donde se transferirá el importe. La cuenta "origen", será el propio objeto desde el que vamos a invocar este método.
Por cierto, conviene comprobar si la cuenta origen tiene suficiente saldo para cubrir el importe de la transferencia, a no ser que estemos de acuerdo en que la cuenta pueda tener saldo negativo y estar en deuda con el banco
Esta sería mi clase
CuentaBancariaimport java.util.Random;
public class CuentaBancaria {
private double saldoDeCuenta;
private String nombreDelTitular;
private long numeroDeCuenta;
public CuentaBancaria(String nombreDelTitular, double saldoDeCuenta) {
this.saldoDeCuenta = saldoDeCuenta;
this.nombreDelTitular = nombreDelTitular;
Random numAleatorioCuenta = new Random();
this.numeroDeCuenta = Math.abs(numAleatorioCuenta.nextLong());
}
public double getSaldo() {
return saldoDeCuenta;
}
public String getDatosCuenta() {
return String.format("CCC: %d\nNombre: %s\nSaldo: %.2f", numeroDeCuenta, nombreDelTitular, saldoDeCuenta);
}
public void realizarTransferencia(CuentaBancaria otraCuenta, double importe) {
if (importe > saldoDeCuenta)
System.out.println("Esta cuenta no tiene saldo suficiente para cubrir el importe a transferir");
else {
saldoDeCuenta -= importe;
otraCuenta.saldoDeCuenta += importe;
}
}
}
Y ahora, una clase para comprobar que funciona la transferencia de dinero, nos puede servir una tan simple y sencilla como esta:
public class Test {
public static void main(String[] args) {
//Creamos cuentas
CuentaBancaria CCC1 = new CuentaBancaria("Sandra Ramirez", 45000.64);
CuentaBancaria CCC2 = new CuentaBancaria("Antonio Losada", 20000.93);
//Mostramos
System.out.println("Cuentas bancarias:");
System.out.println("\n" + CCC1.getDatosCuenta());
System.out.println("\n" + CCC2.getDatosCuenta());
//Transferencia
System.out.println("\nTransfiriendo un importe de: " + 5000.32);
CCC1.realizarTransferencia(CCC2, 5000.32);
//Mostramos de nuevo
System.out.println("\nCuentas despues de haber hecho transferencia:");
System.out.println("\n" + CCC1.getDatosCuenta());
System.out.println("\n" + CCC2.getDatosCuenta());
}
}
Fíjate en lo que decía antes, para hacer la transferencia, invocamos el método desde la cuenta "origen" y nos basta con pasarle como argumento la cuenta "destino" (y el importe claro)
CCC1.realizarTransferencia(CCC2, 5000.32);
Con solo eso, si lo ejecutamos, vemos que todo funciona y básicamente se cumple lo que nos está pidiendo el enunciado:
Cuentas bancarias:
CCC: 7850162117938004654
Nombre: Sandra Ramirez
Saldo: 45000,64
CCC: 3902791561329441160
Nombre: Antonio Losada
Saldo: 20000,93
Transfiriendo un importe de: 5000.32
Cuentas despues de haber hecho transferencia:
CCC: 7850162117938004654
Nombre: Sandra Ramirez
Saldo: 40000,32
CCC: 3902791561329441160
Nombre: Antonio Losada
Saldo: 25001,25
Bien, pues ya lo tenemos.
Sin embargo, ya que parece que no te gustan las cosas tan simples
podemos hacer una versión algo más avanzada.
Ya que intentabas crear "pares" con claves y valores...., podemos hacer un programa con menú para crear tantas cuenta bancarias como queramos.
Estas cuentas las podemos "mapear" utilizando el código de cuenta bancaria como clave para asociarlas.
Y con otra opción de menú, seleccionar una cuenta origen, otra destino y hacer transferencia.
Para ello, primero quiero modificar levemente la clase
CuentaBancaria.
Le vamos a añadir un get para obtener el número de cuenta que se genera aleatoriamente, ya que lo vamos a necesitar para usarlo como clave al "mapear" las cuentas.
Y el método para realizar transferencias, lo vamos a hacer boolean, para que retorne false si no puedo hacerse la transferencia (por falta de fondos) o true si todo salió bien.
Marco en negrita los cambios:
public class CuentaBancaria {
private double saldoDeCuenta;
private String nombreDelTitular;
private long numeroDeCuenta;
public CuentaBancaria(String nombreDelTitular, double saldoDeCuenta) {
this.saldoDeCuenta = saldoDeCuenta;
this.nombreDelTitular = nombreDelTitular;
Random numAleatorioCuenta = new Random();
this.numeroDeCuenta = Math.abs(numAleatorioCuenta.nextLong());
}
public long getNumeroCuenta() {
return numeroDeCuenta;
}
public double getSaldo() {
return saldoDeCuenta;
}
public String getDatosCuenta() {
return String.format("CCC: %d\nNombre: %s\nSaldo: %.2f", numeroDeCuenta, nombreDelTitular, saldoDeCuenta);
}
public boolean realizarTransferencia(CuentaBancaria otraCuenta, double importe) {
if (importe > saldoDeCuenta) {
System.out.println("Esta cuenta no tiene saldo suficiente para cubrir el importe a transferir");
return false;
}
else {
saldoDeCuenta -= importe;
otraCuenta.saldoDeCuenta += importe;
return true;
}
}
}
Y ahora creamos un nuevo programa principal, donde usaremos un HashMap para mapear las cuentas mediante su código de cuenta como clave.
Y con un menú, el usuario podrá escoger opciones.
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
public class Test {
private static HashMap<Long, CuentaBancaria> cuentas = new HashMap<Long, CuentaBancaria>();
private static Scanner teclado = new Scanner(System.in);
public static void main(String[] args) {
int opcion = 0;
while (opcion != 4) {
System.out.println("\n\t\tBANCO ORACLE");
System.out.println("\t\t----- ------\n");
System.out.println("[1] -- Crear una Cuenta Bancaria");
System.out.println("[2] -- Listar todas las Cuentas");
System.out.println("[3] -- Hacer una Transferencia");
System.out.println("[4] -- SALIR");
System.out.print("Elija opcion: ");
opcion = Integer.parseInt(teclado.nextLine());
switch(opcion) {
case 1:
crearCuenta();
break;
case 2:
listarCuentas();
break;
case 3:
hacerTransferencia();
break;
case 4:
System.out.println("\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("Opcion equivocada");
}
}
}
private static void crearCuenta() {
System.out.println("\n\tNUEVA CUENTA");
System.out.print("Nombre Titular: ");
String nombre = teclado.nextLine();
System.out.print("Saldo inicial: ");
double saldo = Double.parseDouble(teclado.nextLine());
CuentaBancaria nuevaCCC = new CuentaBancaria(nombre, saldo);
cuentas.put(nuevaCCC.getNumeroCuenta(), nuevaCCC);
}
private static void listarCuentas() {
System.out.println("\nLISTADO DE CUENTAS");
if (cuentas.isEmpty())
System.out.println("No hay cuentas bancarias registradas");
else {
for(Entry<Long, CuentaBancaria> ccc: cuentas.entrySet())
System.out.println("\n" + ccc.getValue().getDatosCuenta() + "\n");
}
}
private static void hacerTransferencia() {
System.out.println("\n\tHACER TRANSFERENCIA");
System.out.print("Num. Cuenta ORIGEN: ");
long cccOrigen = Long.parseLong(teclado.nextLine());
System.out.print("Num. Cuenta DESTINO: ");
long cccDestino = Long.parseLong(teclado.nextLine());
System.out.print("Importe: ");
double importe = Double.parseDouble(teclado.nextLine());
//Buscamos las cuentas
CuentaBancaria origen = cuentas.get(cccOrigen);
CuentaBancaria destino = cuentas.get(cccDestino);
//Comprobamos que existen, y si existen, intentamos transferencia
if (origen == null)
System.out.println("No existe cuenta ORIGEN con nº: " + cccOrigen);
else if (destino == null)
System.out.println("No existe cuenta DESTINO con nº: " + cccDestino);
else if (origen.realizarTransferencia(destino, importe))
System.out.println("Transferencia realizada con exito");
}
}
Si lo ejecutamos, vemos que se pueden crear cuentas, seleccionarlas mediante su código y hacer transferencias entre ellas:
BANCO ORACLE
----- ------
[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 1
NUEVA CUENTA
Nombre Titular: Sara Pelaez
Saldo inicial: 4500.45
BANCO ORACLE
----- ------
[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 1
NUEVA CUENTA
Nombre Titular: Pedro Ramiro
Saldo inicial: 1500.75
BANCO ORACLE
----- ------
[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 2
LISTADO DE CUENTAS
CCC: 1790563580212299009
Nombre: Pedro Ramiro
Saldo: 1500,75
CCC: 7698480902857524209
Nombre: Sara Pelaez
Saldo: 4500,45
BANCO ORACLE
----- ------
[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 3
HACER TRANSFERENCIA
Num. Cuenta ORIGEN: 7698480902857524209
Num. Cuenta DESTINO: 1790563580212299009
Importe: 500.45
Transferencia realizada con exito
BANCO ORACLE
----- ------
[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 2
LISTADO DE CUENTAS
CCC: 1790563580212299009
Nombre: Pedro Ramiro
Saldo: 2001,20
CCC: 7698480902857524209
Nombre: Sara Pelaez
Saldo: 4000,00
BANCO ORACLE
----- ------
[1] -- Crear una Cuenta Bancaria
[2] -- Listar todas las Cuentas
[3] -- Hacer una Transferencia
[4] -- SALIR
Elija opcion: 4
FIN DE PROGRAMA
Y ahora sí, ya tenemos un programa un poco más avanzado.
Pregunta lo que no entiendas o pienses que pueda ser incorrecto.
Un saludo.