Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import java.util.stream.Collectors;
- import static java.lang.String.format;
- public class BankTester {
- public static void main(String[] args) {
- Scanner jin = new Scanner(System.in);
- String test_type = jin.nextLine();
- switch (test_type) {
- case "typical_usage":
- testTypicalUsage(jin);
- break;
- case "equals":
- testEquals();
- break;
- }
- jin.close();
- }
- private static void testEquals() {
- Account a1 = new Account("Andrej", "20.00$");
- Account a2 = new Account("Andrej", "20.00$");
- Account a3 = new Account("Andrej", "30.00$");
- Account a4 = new Account("Gajduk", "20.00$");
- List<Account> all = Arrays.asList(a1, a2, a3, a4);
- if (!(a1.equals(a1)&&!a1.equals(a2)&&!a2.equals(a1) && !a3.equals(a1)
- && !a4.equals(a1)
- && !a1.equals(null))) {
- System.out.println("Your account equals method does not work properly.");
- return;
- }
- Set<Long> ids = all.stream().map(Account::getId).collect(Collectors.toSet());
- if (ids.size() != all.size()) {
- System.out.println("Different accounts have the same IDS. This is not allowed");
- return;
- }
- FlatAmountProvisionTransaction fa1 = new FlatAmountProvisionTransaction(10, 20, "20.00$", "10.00$");
- FlatAmountProvisionTransaction fa2 = new FlatAmountProvisionTransaction(20, 20, "20.00$", "10.00$");
- FlatAmountProvisionTransaction fa3 = new FlatAmountProvisionTransaction(20, 10, "20.00$", "10.00$");
- FlatAmountProvisionTransaction fa4 = new FlatAmountProvisionTransaction(10, 20, "50.00$", "50.00$");
- FlatAmountProvisionTransaction fa5 = new FlatAmountProvisionTransaction(30, 40, "20.00$", "10.00$");
- FlatPercentProvisionTransaction fp1 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 10);
- FlatPercentProvisionTransaction fp2 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 10);
- FlatPercentProvisionTransaction fp3 = new FlatPercentProvisionTransaction(10, 10, "20.00$", 10);
- FlatPercentProvisionTransaction fp4 = new FlatPercentProvisionTransaction(10, 20, "50.00$", 10);
- FlatPercentProvisionTransaction fp5 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 30);
- FlatPercentProvisionTransaction fp6 = new FlatPercentProvisionTransaction(30, 40, "20.00$", 10);
- if (fa1.equals(fa1) &&
- !fa2.equals(null) &&
- fa2.equals(fa1) &&
- fa1.equals(fa2) &&
- fa1.equals(fa3) &&
- !fa1.equals(fa4) &&
- !fa1.equals(fa5) &&
- !fa1.equals(fp1) &&
- fp1.equals(fp1) &&
- !fp2.equals(null) &&
- fp2.equals(fp1) &&
- fp1.equals(fp2) &&
- fp1.equals(fp3) &&
- !fp1.equals(fp4) &&
- !fp1.equals(fp5) &&
- !fp1.equals(fp6)) {
- System.out.println("Your transactions equals methods do not work properly.");
- return;
- }
- Account accounts[] = new Account[]{a1, a2, a3, a4};
- Account accounts1[] = new Account[]{a2, a1, a3, a4};
- Account accounts2[] = new Account[]{a1, a2, a3};
- Account accounts3[] = new Account[]{a1, a2, a3, a4};
- Bank b1 = new Bank("Test", accounts);
- Bank b2 = new Bank("Test", accounts1);
- Bank b3 = new Bank("Test", accounts2);
- Bank b4 = new Bank("Sample", accounts);
- Bank b5 = new Bank("Test", accounts3);
- if (!(b1.equals(b1) &&
- !b1.equals(null) &&
- !b1.equals(b2) &&
- !b2.equals(b1) &&
- !b1.equals(b3) &&
- !b3.equals(b1) &&
- !b1.equals(b4) &&
- b1.equals(b5))) {
- System.out.println("Your bank equals method do not work properly.");
- return;
- }
- accounts[2] = a1;
- if (!b1.equals(b5)) {
- System.out.println("Your bank equals method do not work properly.");
- return;
- }
- long from_id = a2.getId();
- long to_id = a3.getId();
- Transaction t = new FlatAmountProvisionTransaction(from_id, to_id, "3.00$", "3.00$");
- b1.makeTransaction(t);
- if (b1.equals(b5)) {
- System.out.println("Your bank equals method do not work properly.");
- return;
- }
- b5.makeTransaction(t);
- if (!b1.equals(b5)) {
- System.out.println("Your bank equals method do not work properly.");
- return;
- }
- System.out.println("All your equals methods work properly.");
- }
- private static void testTypicalUsage(Scanner jin) {
- String bank_name = jin.nextLine();
- int num_accounts = jin.nextInt();
- jin.nextLine();
- Account accounts[] = new Account[num_accounts];
- for (int i = 0; i < num_accounts; ++i)
- accounts[i] = new Account(jin.nextLine(), jin.nextLine());
- Bank bank = new Bank(bank_name, accounts);
- while (true) {
- String line = jin.nextLine();
- switch (line) {
- case "stop":
- return;
- case "transaction":
- String descrption = jin.nextLine();
- String amount = jin.nextLine();
- String parameter = jin.nextLine();
- int from_idx = jin.nextInt();
- int to_idx = jin.nextInt();
- jin.nextLine();
- Transaction t = getTransaction(descrption, from_idx, to_idx, amount, parameter, bank);
- System.out.println("Transaction amount: " + t.getAmount());
- System.out.println("Transaction description: " + t.getDescription());
- System.out.println("Transaction successful? " + bank.makeTransaction(t));
- break;
- case "print":
- System.out.println(bank.toString());
- System.out.println("Total provisions: " + bank.totalProvision());
- System.out.println("Total transfers: " + bank.totalTransfers());
- System.out.println();
- break;
- }
- }
- }
- private static Transaction getTransaction(String description, int from_idx, int to_idx, String amount, String o, Bank bank) {
- switch (description) {
- case "FlatAmount":
- return new FlatAmountProvisionTransaction(bank.getAccounts()[from_idx].getId(),
- bank.getAccounts()[to_idx].getId(), amount, o);
- case "FlatPercent":
- return new FlatPercentProvisionTransaction(bank.getAccounts()[from_idx].getId(),
- bank.getAccounts()[to_idx].getId(), amount, Integer.parseInt(o));
- }
- return null;
- }
- }
- class Account{
- private String imeKorisnik;
- private long ID;
- private String saldo;
- public Account(String name, String balance){
- imeKorisnik = name;
- saldo = balance;
- ID = new Random().nextLong();
- }
- public String getBalance(){
- return saldo;
- }
- public String getName(){
- return imeKorisnik;
- }
- public long getId(){
- return ID;
- }
- public void setBalance(String balance){
- saldo = balance;
- }
- public String toString(){
- String sb = "Name: " +
- this.getName() +
- '\n' +
- "Balance: " +
- this.getBalance() +
- '\n';
- return sb;
- }
- @Override
- public int hashCode() {
- int a = 31;
- int b = 7;
- return a*b + imeKorisnik.hashCode();
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Account account = (Account) o;
- return ID == account.ID &&
- imeKorisnik.equals(account.imeKorisnik) &&
- saldo.equals(account.saldo);
- }
- }
- abstract class Transaction{
- final long idOd;
- final long idDo;
- String opis = "";
- final String suma;
- public Transaction(long fromId, long toId, String description, String amount){
- this.idOd = fromId;
- this.idDo = toId;
- this.opis = description;
- this.suma = amount;
- }
- public Transaction(long fromId, long toId, String amount){
- this.idOd = fromId;
- this.idDo = toId;
- this.suma = amount;
- }
- public String getAmount(){
- return this.suma;
- }
- public String getDescription() {
- return this.opis;
- }
- }
- class FlatAmountProvisionTransaction extends Transaction{
- private String provizija;
- public FlatAmountProvisionTransaction(long fromId, long toId,String amount, String flatProvision){
- super(fromId,toId,amount);
- this.opis = "FlatAmount";
- provizija = flatProvision;
- }
- public String getFlatAmount(){
- return this.provizija;
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- if (this.idDo != ((FlatAmountProvisionTransaction) o).idDo) return false;
- if (this.idOd != ((FlatAmountProvisionTransaction) o).idOd) return false;
- if (!this.suma.equals(((FlatAmountProvisionTransaction) o).suma)) return false;
- FlatAmountProvisionTransaction that = (FlatAmountProvisionTransaction) o;
- return provizija.equals(that.provizija);
- }
- @Override
- public int hashCode() {
- return Objects.hash(provizija);
- }
- /*
- @Override
- public boolean equals(Object o){
- if(o == null) return false;
- if(o == this) return true;
- if(((FlatAmountProvisionTransaction) o).getFlatAmount() != this.provizija) return false;
- if (this.idDo != ((FlatAmountProvisionTransaction) o).idDo) return false;
- if (this.idOd != ((FlatAmountProvisionTransaction) o).idOd) return false;
- if (this.suma != ((FlatAmountProvisionTransaction) o).suma) return false;
- return this.opis.equals(((FlatAmountProvisionTransaction) o).suma);
- }
- @Override
- public int hashCode() {
- int a = 31;
- int b = 7;
- return a*b + this.opis.hashCode() + this.provizija.hashCode();
- }
- */
- }
- class FlatPercentProvisionTransaction extends Transaction{
- private int procent;
- public FlatPercentProvisionTransaction (long fromId, long toId, String amount, int centsPerDolar){
- super(fromId,toId,amount);
- opis = "FlatPercent";
- procent = centsPerDolar;
- }
- public int getPercent(){
- return this.procent;
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- if (this.idDo != ((FlatPercentProvisionTransaction) o).idDo) return false;
- if (this.idOd != ((FlatPercentProvisionTransaction) o).idOd) return false;
- if (!this.suma.equals(((FlatPercentProvisionTransaction) o).suma)) return false;
- FlatPercentProvisionTransaction that = (FlatPercentProvisionTransaction) o;
- return procent == that.procent;
- }
- @Override
- public int hashCode() {
- return Objects.hash(procent);
- }
- /*
- @Override
- public boolean equals(Object o){
- if(o == null) return false;
- if(o == this) return true;
- if(((FlatPercentProvisionTransaction) o).getPercent() != this.procent) return false;
- if (this.idDo != ((FlatPercentProvisionTransaction) o).idDo) return false;
- if (this.idOd != ((FlatPercentProvisionTransaction) o).idOd) return false;
- if (this.suma != ((FlatPercentProvisionTransaction) o).suma) return false;
- return this.opis.equals(((FlatPercentProvisionTransaction) o).suma);
- }
- @Override
- public int hashCode() {
- int a = 31;
- int b = 7;
- return a*b + this.opis.hashCode() + this.procent;
- }
- */
- }
- class Bank{
- private String ime;
- private Account[] korisnici;
- private ArrayList<Transaction> transakcii = new ArrayList<>();
- private Double provizija = 0.00;
- private Double vkupnoTransferi = 0.00;
- public Bank(String name, Account[] accounts){
- ime = name;
- korisnici = new Account[accounts.length];
- System.arraycopy(accounts, 0, korisnici, 0, accounts.length);
- }
- public boolean makeTransaction(Transaction t) {
- FlatAmountProvisionTransaction fapt = new FlatAmountProvisionTransaction(1, 2, "23$", "10$");
- FlatPercentProvisionTransaction fppt = new FlatPercentProvisionTransaction(1, 2, "23$", 10);
- if (t.getClass() == fapt.getClass()) {
- FlatAmountProvisionTransaction transakcija = (FlatAmountProvisionTransaction) t;
- Account korisnikPrakja = null;
- Account korisnikPrima = null;
- for (Account account : this.korisnici) {
- if (account.getId() == (transakcija.idOd)) {
- korisnikPrakja = account;
- }
- if (account.getId() == (transakcija.idDo)) {
- korisnikPrima = account;
- }
- }
- if (korisnikPrakja == null || korisnikPrima == null) return false;
- String iznos = transakcija.getAmount();
- String provizija = transakcija.getFlatAmount();
- String balansPrakjach = korisnikPrakja.getBalance();
- String balansPrimach = korisnikPrima.getBalance();
- iznos = iznos.substring(0, iznos.length() - 1);
- provizija = provizija.substring(0, provizija.length() - 1);
- balansPrakjach = balansPrakjach.substring(0, balansPrakjach.length() - 1);
- balansPrimach = balansPrimach.substring(0, balansPrimach.length() - 1);
- Double iznoss = Double.parseDouble(iznos);
- Double provizijaa = Double.parseDouble(provizija);
- double balanssPrakjach = Double.parseDouble(balansPrakjach);
- Double balanssPrimach = Double.parseDouble(balansPrimach);
- if ((iznoss + provizijaa) > balanssPrakjach) return false;
- else {
- Double novaSostojbaK1 = balanssPrakjach - (iznoss + provizijaa);
- Double novaSostojbaK2 = balanssPrimach + iznoss;
- balansPrakjach = format("%.2f", novaSostojbaK1);
- balansPrimach = format("%.2f", novaSostojbaK2);
- balansPrakjach += "$";
- balansPrimach += "$";
- korisnikPrakja.setBalance(balansPrakjach);
- korisnikPrima.setBalance(balansPrimach);
- this.provizija += provizijaa;
- this.vkupnoTransferi += iznoss;
- return true;
- }
- }
- if(t.getClass() == fppt.getClass()){
- FlatPercentProvisionTransaction transakcija = (FlatPercentProvisionTransaction) t;
- Account korisnikPrakja = null;
- Account korisnikPrima = null;
- for (Account account : this.korisnici) {
- if (account.getId() == (transakcija.idOd)) {
- korisnikPrakja = account;
- }
- if (account.getId() == (transakcija.idDo)) {
- korisnikPrima = account;
- }
- }
- if (korisnikPrakja == null || korisnikPrima == null) return false;
- String iznos = transakcija.suma;
- int procentProvizija = transakcija.getPercent();
- String balansPrakjach = korisnikPrakja.getBalance();
- String balansPrimach = korisnikPrima.getBalance();
- iznos = iznos.substring(0, iznos.length() - 1);
- balansPrakjach = balansPrakjach.substring(0, balansPrakjach.length() - 1);
- balansPrimach = balansPrimach.substring(0, balansPrimach.length() - 1);
- Double iznoss = Double.parseDouble(iznos);
- double balanssPrakjach = Double.parseDouble(balansPrakjach);
- Double balanssPrimach = Double.parseDouble(balansPrimach);
- Double provizija = Math.floor(iznoss) * (procentProvizija/100.0);
- if((iznoss + provizija) > balanssPrakjach) return false;
- else{
- Double novaSostojbaK1 = balanssPrakjach - (iznoss + provizija);
- Double novaSostojbaK2 = balanssPrimach + iznoss;
- balansPrakjach = format("%.2f", novaSostojbaK1);
- balansPrimach = format("%.2f", novaSostojbaK2);
- balansPrakjach += "$";
- balansPrimach += "$";
- korisnikPrakja.setBalance(balansPrakjach);
- korisnikPrima.setBalance(balansPrimach);
- this.provizija += provizija;
- this.vkupnoTransferi += iznoss;
- return true;
- }
- }
- return false;
- }
- public String totalTransfers(){
- String s = format("%.2f",vkupnoTransferi);
- s += "$";
- return s;
- }
- public String totalProvision(){
- return format("%.2f",provizija) + "$";
- }
- public String toString(){
- StringBuilder res = new StringBuilder("Name: " + this.ime + "\r\n" + "\r\n");
- for (Account account : korisnici) {
- res.append(account.toString());
- }
- return res.toString();
- }
- public Account[] getAccounts() {
- return korisnici;
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Bank bank = (Bank) o;
- return ime.equals(bank.ime) &&
- Arrays.equals(korisnici, bank.korisnici) &&
- Objects.equals(transakcii, bank.transakcii) &&
- Objects.equals(provizija, bank.provizija) &&
- Objects.equals(vkupnoTransferi, bank.vkupnoTransferi);
- }
- @Override
- public int hashCode() {
- int result = Objects.hash(ime, transakcii, provizija, vkupnoTransferi);
- result = 31 * result + Arrays.hashCode(korisnici);
- return result;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement