package pgdp; public class Bank { private BankAccountList accounts; public int newAccount(String firstname, String lastname) { BankAccount account = new BankAccount(getNextFreeAccountID(), firstname, lastname); if (accounts == null) accounts = new BankAccountList(account, null); else accounts = accounts.insertSorted(account); return account.getAccountnumber(); } public void removeAccount(int accountnumber) { if (accounts != null) accounts = accounts.remove(accountnumber); } public Money getBalance(int accountnumber) { BankAccount account = getAccount(accountnumber); if (account == null) return null; else return account.getBalance(); } public boolean depositOrWithdraw(int accountnumber, Money m) { BankAccount account = getAccount(accountnumber); if (account == null) return false; account.addMoney(m); return true; } public boolean transfer(int from, int to, Money m) { BankAccount fromAcc = getAccount(from); BankAccount toAcc = getAccount(to); if (fromAcc == null || toAcc == null) return false; fromAcc.addMoney(new Money(-m.getCent())); toAcc.addMoney(m); return true; } private BankAccount getAccount(int accountnumber) { if (accounts == null) return null; return accounts.get(accountnumber); } private int getNextFreeAccountID() { // In dieser Implementierung soll die erste unbelegte Accountnummer // zurückgegeben werden. Alternativ kann man natürlich einfach die // des letzte + 1 nehmen oder ähnliches. if (accounts == null) return 1000001; return accounts.getNextFreeID(1000001); } public String toString() { if (accounts == null) return ""; return accounts.toString(); } private class BankAccountList { public BankAccount info; public BankAccountList next; public BankAccountList(BankAccount info, BankAccountList next) { this.info = info; this.next = next; } /** * Fügt den neuen Account korrekt nach Accountnummer sortiert in die * Liste ein. (Das ist nicht nötig, aber spannender) * Gibt immer den nächsten Knoten des Vorgängers zurück (normalerweise * ist das der Knoten selbst, allerdings könnte auch ein neuer Knoten * zuvor eingefügt werden, dann ist dieser der nächste des Vorgängers). */ public BankAccountList insertSorted(BankAccount account) { if (account.getAccountnumber() < info.getAccountnumber()) // für die aufsteigende Sortierung -> neuer Account gehört davor return new BankAccountList(account, this); else if (next == null) // kein nächster mehr -> hinten anfügen next = new BankAccountList(account, null); else next = next.insertSorted(account); return this; // sich selbst zurückgeben als nächsten für den Vorgänger } public BankAccountList remove(int accountnumber) { if (next == null) return this; if (info.getAccountnumber() == accountnumber) return next; // nächsten zurückgeben, dadurch wird this entfernt next = next.remove(accountnumber); return this; // nichts geändert } /** * Gibt den Bank-Account mit der jeweiligen Accountnummer zurück. * return null falls nicht existent. */ public BankAccount get(int accountnumber) { if (info.getAccountnumber() == accountnumber) return info; else if (next != null) return next.get(accountnumber); else return null; } /** * Gibt die kleinste unbelegte Accountnummer größere oder gleich startingFrom * zurück. Wir nutzen hier aus, dass die Liste sortiert ist. */ public int getNextFreeID(int startingFrom) { if (startingFrom <= info.getAccountnumber()) if (next == null) return info.getAccountnumber()+1; else return next.getNextFreeID(info.getAccountnumber()+1); else return startingFrom; } public String toString() { return info + "\n-> " + (next != null ? next.toString() : "Ende"); } } public static void main(String[] args) { Bank b = new Bank(); int[][] acc = new int[5][2]; acc[0][0] = b.newAccount("Fred", "Feuerstein"); acc[1][0] = b.newAccount("Torben", "Schröder"); acc[2][0] = b.newAccount("Lilly", "Potter"); acc[3][0] = b.newAccount("Ronald", "Peterson"); acc[4][0] = b.newAccount("Bastian", "Schweinsteiger"); for (int a[] : acc) { System.out.print(a[0] + ": " + b.getBalance(a[0])); System.out.print(" {" + b.getAccount(a[0]) + "}"); System.out.println(""); } for (int i = 0; i < 5; i++) for (int a[] : acc) { int add = new java.util.Random().nextInt(20000)-10000; int oldBalance = b.getBalance(a[0]).getCent(); a[1] += add; if (!b.depositOrWithdraw(a[0], new Money(add))) System.out.println("Could not deposit... !!!!!!!!!!!!!!!! ATTENTION --- THIS SHOULD NOT HAPPEN --- ATTENTION !!!!!!!!!!!!!"); System.out.println(a[0] + ": " + oldBalance + " + " + + add + " -> " + b.getBalance(a[0])); } System.out.println("\n\nCHECK:"); for (int a[] : acc) { System.out.println(a[0] + ": " + b.getBalance(a[0]) + " == " + a[1] + " ---> " + (b.getBalance(a[0]).getCent() == a[1])); } System.out.println("\n\nAll in list:"); BankAccountList current = b.accounts; while (current != null) { System.out.println(" " + current.info); current = current.next; } System.out.println("Try remove probably not existing 491203193..."); b.removeAccount(491203193); System.out.println("All in list:"); current = b.accounts; while (current != null) { System.out.println(" " + current.info); current = current.next; } for (int i = 0; i < 8; i++) { System.out.println("\n\n"); int fromIndex = new java.util.Random().nextInt(acc.length); int toIndex = new java.util.Random().nextInt(acc.length); int from = acc[fromIndex][0]; int to = acc[toIndex][0]; int money = new java.util.Random().nextInt(100); acc[fromIndex][1] -= money; acc[toIndex][1] += money; System.out.println("Try transfer " + money + " from " + from + " to " + to + " :"); System.out.println("Deposit " + (b.transfer(from, to, new Money(money)) ? "successful" : "failed (!!!!!!!!!!!!!!!! ATTENTION --- THIS SHOULD NOT HAPPEN --- ATTENTION !!!!!!!!!!!!!)")); System.out.println("All in list:"); current = b.accounts; while (current != null) { System.out.println(" " + current.info); current = current.next; } if (i >= 3) { System.out.println("Try transfer back " + money + " from " + to + " to " + from + " :"); System.out.println("Deposit " + (b.transfer(to, from, new Money(money)) ? "successful" : "failed (!!!!!!!!!!!!!!!! ATTENTION --- THIS SHOULD NOT HAPPEN --- ATTENTION !!!!!!!!!!!!!)")); acc[fromIndex][1] += money; acc[toIndex][1] -= money; System.out.println("All in list:"); current = b.accounts; while (current != null) { System.out.println(" " + current.info); current = current.next; } } } System.out.println("\n\nCHECK:"); for (int a[] : acc) { System.out.println(a[0] + ": " + b.getBalance(a[0]) + " == " + a[1] + " ---> " + (b.getBalance(a[0]).getCent() == a[1])); } for (int i = 1; i < acc.length-2; i++) { System.out.println("\n\nRemove existing acc " + i + " Nr: " + acc[i][0]); b.removeAccount(acc[i][0]); System.out.println("Try deposit on " + acc[i][0] + ":"); System.out.println("Deposit " + (b.depositOrWithdraw(acc[i][0], new Money(10000)) ? "successful (!!!!!!!!!!!!!!!! ATTENTION --- THIS SHOULD NOT HAPPEN --- ATTENTION !!!!!!!!!!!!!)" : "failed")); System.out.println("All in list:"); current = b.accounts; while (current != null) { System.out.println(" " + current.info); current = current.next; } System.out.println("Try transfer from " + acc[i][0] + " to " + acc[(i+1)][0] + " :"); System.out.println("Deposit " + (b.transfer(acc[i][0], acc[i+1][0], new Money(7584)) ? "successful (!!!!!!!!!!!!!!!! ATTENTION --- THIS SHOULD NOT HAPPEN --- ATTENTION !!!!!!!!!!!!!)" : "failed")); System.out.println("Try transfer from " + acc[i-1][0] + " to " + acc[i][0] + " :"); System.out.println("Deposit " + (b.transfer(acc[i-1][0], acc[i][0], new Money(9302)) ? "successful (!!!!!!!!!!!!!!!! ATTENTION --- THIS SHOULD NOT HAPPEN --- ATTENTION !!!!!!!!!!!!!)" : "failed")); System.out.println("All in list:"); current = b.accounts; while (current != null) { System.out.println(" " + current.info); current = current.next; } System.out.println("Try removing " + acc[i][0] + " again."); b.removeAccount(acc[i][0]); System.out.println("All in list:"); current = b.accounts; while (current != null) { System.out.println(" " + current.info); current = current.next; } System.out.println("\n\nCHECK:"); for (int j = 0; j < acc.length; j++) { if (j >= 1 && j <= i) continue; System.out.println(acc[j][0] + ": " + b.getBalance(acc[j][0]) + " == " + acc[j][1] + " ---> " + (b.getBalance(acc[j][0]).getCent() == acc[j][1])); } } } }