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; + } + +}