Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import java.util.stream.Collectors;
- import java.util.Arrays;
- import java.util.stream.IntStream;
- class Account {
- private String name;
- private String balance;
- private long id;
- Account(String n, String b) {
- Random rand = new Random();
- this.name = n;
- this.balance = b;
- this.id = rand.nextLong();
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getBalance() {
- return balance;
- }
- public void setBalance(String balance) {
- this.balance = balance;
- }
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return "Name: " + name + "\nBalance: " + balance + "\n";
- }
- }
- abstract class Transaction {
- protected final long fromId, toId;
- protected final String description;
- protected final String amount;
- public Transaction(long fromId, long toId, String description, String amount) {
- this.fromId = fromId;
- this.toId = toId;
- this.description = description;
- this.amount = amount;
- }
- public String getAmount() {
- return amount;
- }
- public double getAmountAsDouble() {
- return Money.toDouble(amount);
- }
- public long getFromId() {
- return fromId;
- }
- public long getToId() {
- return toId;
- }
- public String getDescription() {
- return description;
- }
- public abstract double getProvision();
- }
- class Money {
- static double toDouble(String string) {
- String temp = string.substring(0, string.length() - 1);
- return Double.parseDouble(temp);
- }
- }
- class FlatAmountProvisionTransaction extends Transaction{
- private String flatAmount;
- FlatAmountProvisionTransaction(long fromId, long toId, String amount, String flatProvision) {
- super(fromId, toId, "FlatAmount", amount);
- this.flatAmount = flatProvision;
- }
- public String getFlatAmount() {
- return amount;
- }
- public String getFlatProvision() {
- return flatAmount;
- }
- public double getProvision() {
- return Money.toDouble(flatAmount);
- }
- }
- class FlatPercentProvisionTransaction extends Transaction {
- private int FlatPercent;
- FlatPercentProvisionTransaction(long fromId, long toId, String amount, int centsPerDolar) {
- super(fromId, toId, "FlatPercent", amount);
- this.FlatPercent = centsPerDolar;
- }
- public int getFlatPercent() {
- return FlatPercent;
- }
- @Override
- public double getProvision() {
- return FlatPercent / 100.0 * (int) super.getAmountAsDouble();
- }
- }
- class Bank {
- private String name;
- private Account accounts[];
- private int totalTransfers;
- private int totalProvision;
- public Bank(String name, Account[] accounts) {
- super();
- totalTransfers = 0;
- totalProvision = 0;
- this.name = name;
- this.accounts = Arrays.copyOf(accounts, accounts.length);
- }
- public String getName() {
- return name;
- }
- public String totalProvision() {
- return moneyAsString(totalProvision);
- }
- public String totalTransfers() {
- return moneyAsString(totalTransfers);
- }
- public Account[] getAccounts() {
- return accounts;
- }
- public static long moneyAsLong(String strBalance) {
- long lngBalance = 0;
- lngBalance += Integer.parseInt(strBalance.substring(strBalance.length() - 3, strBalance.length() - 1)); // cents
- lngBalance += 100 * Long.parseLong(strBalance.substring(0, strBalance.length() - 4)); // dollars
- return lngBalance;
- }
- public static String moneyAsString(long value) {
- return (value / 100) + "." + String.format("%2d", value % 100) + "$";
- }
- public int getIndex(long id) {
- return IntStream.range(0, accounts.length)
- .filter(i -> accounts[i].getId() == id)
- .findFirst()
- .orElse(-1);
- }
- public boolean makeTransaction(Transaction t) {
- int fromIndex = getIndex(t.getFromId());
- int toIndex = getIndex(t.getToId());
- // check if Sender and Receiver have accounts in the bank
- if (fromIndex == -1 || toIndex == -1) {
- return false;
- }
- // check if Sender has enough money in his balance
- if (moneyAsLong(accounts[fromIndex].getBalance()) < moneyAsLong(t.getAmount())) {
- return false;
- }
- long provision = (long) t.getProvision();
- // taking money from sender (amount sent + provision)
- accounts[fromIndex].setBalance(
- moneyAsString(
- moneyAsLong(accounts[fromIndex].getBalance()) - moneyAsLong(t.getAmount()) - provision
- )
- );
- // adding money to receiver (amount sent only)
- accounts[toIndex].setBalance(
- moneyAsString(
- moneyAsLong(accounts[toIndex].getBalance()) + moneyAsLong(t.getAmount())
- )
- );
- // incrementing provision and transfers
- totalProvision += provision;
- totalTransfers += moneyAsLong(t.getAmount());
- return true;
- }
- @Override
- public String toString() {
- StringBuffer sb = new StringBuffer("");
- sb.append("Name: " + name + "\n\n");
- for (Account account : accounts) {
- sb.append(account.toString());
- }
- return sb.toString();
- }
- }
Add Comment
Please, Sign In to add comment