From 6b07ed1796dc837e3ee2d3a0c7f4e21f634d0a8c Mon Sep 17 00:00:00 2001 From: Deepak Kumar Date: Mon, 4 May 2020 20:42:52 +0530 Subject: [PATCH] Splitwise implementation --- .classpath | 10 +++ .project | 17 ++++ .settings/org.eclipse.jdt.core.prefs | 14 ++++ bin/Demo/SplitDemo.class | Bin 0 -> 1260 bytes bin/Manager/TransactionManager.class | Bin 0 -> 6049 bytes bin/Manager/UserManager.class | Bin 0 -> 2026 bytes bin/Model/SplitType.class | Bin 0 -> 984 bytes bin/Model/User.class | Bin 0 -> 1225 bytes src/Demo/SplitDemo.java | 24 ++++++ src/Manager/TransactionManager.java | 111 +++++++++++++++++++++++++++ src/Manager/UserManager.java | 38 +++++++++ src/Model/SplitType.java | 5 ++ src/Model/User.java | 46 +++++++++++ 13 files changed, 265 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 bin/Demo/SplitDemo.class create mode 100644 bin/Manager/TransactionManager.class create mode 100644 bin/Manager/UserManager.class create mode 100644 bin/Model/SplitType.class create mode 100644 bin/Model/User.class create mode 100644 src/Demo/SplitDemo.java create mode 100644 src/Manager/TransactionManager.java create mode 100644 src/Manager/UserManager.java create mode 100644 src/Model/SplitType.java create mode 100644 src/Model/User.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..038a0e7 --- /dev/null +++ b/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..5ba314f --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + Split + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..ef28d2b --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=13 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=13 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=13 diff --git a/bin/Demo/SplitDemo.class b/bin/Demo/SplitDemo.class new file mode 100644 index 0000000000000000000000000000000000000000..f2bf792d4a5f9975d50aacf7dd6a9486e3dd2c86 GIT binary patch literal 1260 zcmZuw+fo`q5Iw_f0arzCF~(d-Gyz4){kFscMPrgxD?zEE@{k&E#npA8mc=T+B9Hlw z=@*Ao2u%Ljx%=Gk}>FMrs`p>_gzX800D#67tQqT_SnPS7xZDC39FogE_ zA)RoF02uZ_)>9|E~%~Jm9*?5Kn$qFMcoDmTuORR7t`ZLu8Gcyrx;1t)^ym z>>xr2h$Si`CK3r4b-pbCO$pZ+Cc1AnEp9e>)z<6g`O`SAi}WWL#*=Cn*b}_{@nl~= zoQ(Xq#o#UO>igV}J7nffZrXm_rA8Grt-<$$n8JMt)7{4{TQ@R!%i>2(84r*oAaAOA zlUh67SF+P^CFOLX{Y=0VU+!CjXaj;sV_w2sH*%Y%LcK*zmXX0j2I-I+Ep20mA(kw3 z0`;Jj03PG1geSz>8qsJt>~9`5D8Ms3r*f7*Zsk>mF?HZx2_lY{GKuFkb-F1;v#1*e z!)o#}Ydsz(J!P<_OW{)`@j+I`8$qSNLG0Uk!|>(4=GwKBOt@7e0Y$D*3Byq9LKsy1 zm6S5bwva-HZidNo*ky^3F1-zYq>-FMgUORt`xQ?8>!^Hc0GsV;MMu&L6gpU}x2&qR zqKk1EIUm7!p?@Smv(_%!MHbB%trDFxv@_bhGbiwWC&NXGK>J!~V~A|o0nk27rvOGU z+Ijq!0(r<+J42{^LL)kRjK~?{<=GRAulauAM%f*{SuA_Pw~J+OI8i*sz4dfB5k=}0 zvvWW2=ol~3$56ZuG~qxU)XgXs`cWc1cRRhA_BsqdB_mThF`C#k#*jrAIYjUYQB=sg xL-dOhW}GzXE>9;vzF-kcR78xB1uRq1X((91TZ+F*2vM@*c}E_G_vCZo!+#;IDv1C9 literal 0 HcmV?d00001 diff --git a/bin/Manager/TransactionManager.class b/bin/Manager/TransactionManager.class new file mode 100644 index 0000000000000000000000000000000000000000..bf62321258dbbdc415770cccc2541dbeae232054 GIT binary patch literal 6049 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 payee = Arrays.asList("Shika", "Anant", "Deepak"); + transManager.splitBill("Deepak", 1500.0, payee, SplitType.EQUAL); + transManager.printAll(); + payee = Arrays.asList("Deepak", "Anant"); + transManager.splitBill("Shika", 1000.0, payee, SplitType.EQUAL); + transManager.printAll(); + } + +} diff --git a/src/Manager/TransactionManager.java b/src/Manager/TransactionManager.java new file mode 100644 index 0000000..78d3c73 --- /dev/null +++ b/src/Manager/TransactionManager.java @@ -0,0 +1,111 @@ +package Manager; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import Model.SplitType; + +public class TransactionManager { + private HashMap> transaction; + + public TransactionManager(UserManager userManager) { + super(); + transaction = new HashMap<>(); + ArrayList list = userManager.getAllUsers(); + for(String user: list) { + HashMap map = new HashMap<>(); + transaction.put(user, map); + } + } + public void splitBill(String payerId, Double amount, List payeeId, SplitType type) { + assert(payeeId.size() > 0); + Double splitAmount = amount/(payeeId.size()); + splitAmount = Math.round(splitAmount*100)/100.0; + HashMap map = transaction.get(payerId); + for(String payee: payeeId) { + if(payee.equalsIgnoreCase(payerId)) { + continue; + } + HashMap payeeMap = transaction.get(payee); + if(payeeMap.containsKey(payerId)) { + payeeMap.put(payerId, payeeMap.get(payerId)-splitAmount); + } else { + payeeMap.put(payerId, -splitAmount); + } + if(map.containsKey(payee)) { + map.put(payee, map.get(payee)+splitAmount); + } else { + map.put(payee, splitAmount); + } + } + } + public void splitBill(String payer, Double amount, List payeeId, SplitType type, + List values) { + if(type == SplitType.EXACT) { + double sum = 0; + for(Double value: values) { + sum += value; + } + if(amount != sum || payeeId.size() != values.size()) { + System.out.println("Values don't sum up to total."); + return; + } + HashMap map = transaction.get(payer); + for(int i = 0; i < payeeId.size(); i++) { + String payee = payeeId.get(i); + Double amt = values.get(i); + if(payee.equalsIgnoreCase(payer)) { + continue; + } + HashMap payeeMap = transaction.get(payee); + if(payeeMap.containsKey(payer)) { + payeeMap.put(payer, payeeMap.get(payer)-amt); + } else { + payeeMap.put(payer, -amt); + } + if(map.containsKey(payee)) { + map.put(payee, map.get(payee)+amt); + } else { + map.put(payee, amt); + } + } + } else if(type == SplitType.PERCENTAGE) { + Double total = 0.0, amt = 0.0; + List owed = new ArrayList<>(); + for(Double value: values) { + total += value; + amt = (amount*value)/100; + amt = Math.round(amt*100)/100.0; + owed.add(amt); + } + if(total != 100 || payeeId.size() != values.size()) { + System.out.println("Total doesn't add up."); + } + splitBill(payer, amount, payeeId, SplitType.EXACT, owed); + } else { + splitBill(payer, amount, payeeId, SplitType.EQUAL); + } + } + + public void printAll() { + for(Map.Entry> entrySet: transaction.entrySet()) { + String user = entrySet.getKey(); + HashMap payer = entrySet.getValue(); + System.out.println("Details of User: "+user); + for(Map.Entry entry: payer.entrySet()) { + Double amt = entry.getValue(); + if(amt < 0) { + System.out.println(user+" owes "+-amt+" to "+entry.getKey()); + } else if(amt > 0) { + System.out.println(user+" is owed "+amt+" by "+entry.getKey()); + } else { + System.out.println("All settled between "+user+" and "+entry.getKey()); + } + } + System.out.println(); + } + System.out.println("\n\n"); + } +} diff --git a/src/Manager/UserManager.java b/src/Manager/UserManager.java new file mode 100644 index 0000000..477b611 --- /dev/null +++ b/src/Manager/UserManager.java @@ -0,0 +1,38 @@ +package Manager; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import Model.User; + +public class UserManager { + private HashMap userMap; + + public UserManager() { + super(); + userMap = new HashMap<>(); + } + + public void loadUsers() { + List users = Arrays.asList( + new User("Shika", "Shika", "Shika@gmail", "76543"), + new User("Deepak", "Deepak", "Deepak@gmail", "76543"), + new User("Anant", "Anant", "Anant@gmail", "76543"), + new User("Nikhil", "Nikhil", "Nikhil@gmail", "76543"), + new User("Pankaj", "Pankaj", "Pankaj@gmail", "76543") + ); + for(User user: users) { + userMap.put(user.getUserName(), user); + } + } + + public ArrayList getAllUsers() { + ArrayList users = new ArrayList<>(); + for(String user: userMap.keySet()) { + users.add(user); + } + return users; + } +} diff --git a/src/Model/SplitType.java b/src/Model/SplitType.java new file mode 100644 index 0000000..4b4cc29 --- /dev/null +++ b/src/Model/SplitType.java @@ -0,0 +1,5 @@ +package Model; + +public enum SplitType { + EQUAL, PERCENTAGE, EXACT +} diff --git a/src/Model/User.java b/src/Model/User.java new file mode 100644 index 0000000..430c336 --- /dev/null +++ b/src/Model/User.java @@ -0,0 +1,46 @@ +package Model; + +public class User { + private String userName, name, email, mobile; + + public User(String userName, String name, String email, String mobile) { + super(); + this.userName = userName; + this.name = name; + this.email = email; + this.mobile = mobile; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + +}