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 0000000..f2bf792
Binary files /dev/null and b/bin/Demo/SplitDemo.class differ
diff --git a/bin/Manager/TransactionManager.class b/bin/Manager/TransactionManager.class
new file mode 100644
index 0000000..bf62321
Binary files /dev/null and b/bin/Manager/TransactionManager.class differ
diff --git a/bin/Manager/UserManager.class b/bin/Manager/UserManager.class
new file mode 100644
index 0000000..4678482
Binary files /dev/null and b/bin/Manager/UserManager.class differ
diff --git a/bin/Model/SplitType.class b/bin/Model/SplitType.class
new file mode 100644
index 0000000..ac30f00
Binary files /dev/null and b/bin/Model/SplitType.class differ
diff --git a/bin/Model/User.class b/bin/Model/User.class
new file mode 100644
index 0000000..d506bdd
Binary files /dev/null and b/bin/Model/User.class differ
diff --git a/src/Demo/SplitDemo.java b/src/Demo/SplitDemo.java
new file mode 100644
index 0000000..4cc7e86
--- /dev/null
+++ b/src/Demo/SplitDemo.java
@@ -0,0 +1,24 @@
+package Demo;
+
+import java.util.Arrays;
+import java.util.List;
+
+import Manager.TransactionManager;
+import Manager.UserManager;
+import Model.SplitType;
+
+public class SplitDemo {
+
+ public static void main(String[] args) {
+ UserManager userManager = new UserManager();
+ userManager.loadUsers();
+ TransactionManager transManager = new TransactionManager(userManager);
+ List 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;
+ }
+
+}