diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e10e727
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/.metadata/
diff --git a/SplitWise/.classpath b/SplitWise/.classpath
new file mode 100644
index 0000000..51a8bba
--- /dev/null
+++ b/SplitWise/.classpath
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/SplitWise/.gitignore b/SplitWise/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/SplitWise/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/SplitWise/.project b/SplitWise/.project
new file mode 100644
index 0000000..416be55
--- /dev/null
+++ b/SplitWise/.project
@@ -0,0 +1,17 @@
+
+
+ SplitWise
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/SplitWise/.settings/org.eclipse.jdt.core.prefs b/SplitWise/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..ec1937b
--- /dev/null
+++ b/SplitWise/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+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.enumIdentifier=error
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/SplitWise/src/Owe.java b/SplitWise/src/Owe.java
new file mode 100644
index 0000000..d33b8cd
--- /dev/null
+++ b/SplitWise/src/Owe.java
@@ -0,0 +1,23 @@
+
+public class Owe {
+ private User iOwe;
+ private User to;
+ private double amount;
+ Owe (User iowe, User to, double amount) {
+ this.iOwe = iowe;
+ this.to = to;
+ this.amount = amount;
+ }
+
+ void getDetails () {
+ System.out.println(iOwe + " owes " + to + " : " + amount);
+ }
+
+ double getamount () {
+ return amount;
+ }
+
+ void updateAmount (double amount) {
+ this.amount = amount;
+ }
+}
diff --git a/SplitWise/src/SplitWiseDrive.java b/SplitWise/src/SplitWiseDrive.java
new file mode 100644
index 0000000..7d84d2d
--- /dev/null
+++ b/SplitWise/src/SplitWiseDrive.java
@@ -0,0 +1,58 @@
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Scanner;
+
+public class SplitWiseDrive {
+ public static void main (String [] args) {
+ ArrayList users = new ArrayList();
+ users.add(new User("User1"));
+ users.add(new User("User2"));
+ users.add(new User("User3"));
+ users.add(new User("User4"));
+ HashMap map = new HashMap();
+ for (User usertoid : users)
+ map.put(usertoid.getId(), usertoid);
+
+ Queue events = new LinkedList();
+ Scanner sc = new Scanner(System.in);
+ int numberOfTransactions = sc.nextInt();
+ while (numberOfTransactions-- > 0) {
+ String currentTransaction = sc.next();
+ events.add(currentTransaction);
+ }
+
+ splitWiseService service = new splitWiseService(users);
+ while (! events.isEmpty()) {
+ String currentEvent = events.remove();
+ String [] current = currentEvent.split(",");
+ if (current[0].equalsIgnoreCase("show") && current.length == 2) {
+ service.show(map.get(Integer.parseInt(current[1])));
+ System.out.println();
+ }
+ else if (current[0].equalsIgnoreCase("show") && current.length == 1) {
+ service.show();
+ System.out.println();
+ }
+ else {
+ ArrayList al = new ArrayList();
+ ArrayList division = new ArrayList();
+ int i = 0;
+ for (i = 0 ; i < Integer.parseInt(current[3]) ; i++)
+ al.add(map.get(Integer.parseInt(current[i+4])));
+ if (i+5 < current.length) {
+ for (int j = i+5 ; j < current.length ; j++)
+ division.add(Integer.parseInt(current[j]));
+ }
+ service.expense(map.get(Integer.parseInt(current[1])), Double.parseDouble(current[2]), Integer.parseInt(current[3]), al, current[i+4], division);
+ System.out.println();
+ }
+ }
+
+
+
+
+
+ }
+}
diff --git a/SplitWise/src/Transaction.java b/SplitWise/src/Transaction.java
new file mode 100644
index 0000000..afe322e
--- /dev/null
+++ b/SplitWise/src/Transaction.java
@@ -0,0 +1,60 @@
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class Transaction {
+ private HashMap oweData = new HashMap();
+ protected void expenseEqual (User payed, double amount, int numberOfUsers, ArrayList sharingUser) {
+ double dividedAmount = amount/numberOfUsers;
+ for (User userOwe : sharingUser) {
+ if (userOwe == payed)
+ continue;
+ updateOwe(payed, userOwe, dividedAmount);
+ }
+ }
+
+ protected void expenseExact (User payed, double amount, int numberOfUsers, ArrayList sharingUser, ArrayList sharingUserAmount) {
+ int i = 0;
+ for (User userOwe : sharingUser) {
+ updateOwe(payed, userOwe, sharingUserAmount.get(i));
+ i++;
+ }
+ }
+
+ protected void expensePercent (User payed, double amount, int numberOfUsers, ArrayList sharingUser, ArrayList sharingUserAmount) {
+ int i = 0;
+ for (User userOwe : sharingUser) {
+ if (userOwe == payed)
+ continue;
+ double newamount = (amount*sharingUserAmount.get(i))/100;
+ updateOwe(payed, userOwe, newamount);
+ i++;
+ }
+ }
+
+ private void updateOwe (User payed, User owed, double amount) {
+ String key = getKey(payed, owed);
+ Owe data = oweData.get(key);
+ String [] whooweswho = key.split("-");
+ if (Integer.parseInt(whooweswho[0]) == owed.getId())
+ amount = amount + data.getamount();
+ else
+ amount = data.getamount() - amount;
+ data.updateAmount(amount);
+ }
+
+ private String getKey (User id1, User id2) {
+ String key = id1.getId() + "-" + id2.getId();
+ if (! oweData.containsKey(key)) {
+ key = id2.getId() + "-" + id1.getId();
+ if (! oweData.containsKey(key))
+ oweData.put(key, new Owe(id2, id1, 0));
+ }
+
+ return key;
+ }
+
+ public HashMap getOweData () {
+ return oweData;
+ }
+
+}
diff --git a/SplitWise/src/User.java b/SplitWise/src/User.java
new file mode 100644
index 0000000..028fa07
--- /dev/null
+++ b/SplitWise/src/User.java
@@ -0,0 +1,31 @@
+import java.util.HashMap;
+
+public class User {
+ private String name;
+ private int id;
+ private static int counter = 1;
+// private HashMap IOwe = new HashMap();
+// private HashMap OwetoMe = new HashMap();
+
+ User (String name) {
+ this.name = name;
+ this.id = counter;
+ counter = counter + 1;;
+ }
+
+ int getId () {
+ return id;
+ }
+
+ String getName () {
+ return name;
+ }
+
+// HashMap getOweData () {
+// return IOwe;
+// }
+//
+// HashMap getOwetoMeData () {
+// return OwetoMe;
+// }
+}
diff --git a/SplitWise/src/splitWiseService.java b/SplitWise/src/splitWiseService.java
new file mode 100644
index 0000000..3418f44
--- /dev/null
+++ b/SplitWise/src/splitWiseService.java
@@ -0,0 +1,106 @@
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class splitWiseService {
+ HashMap UserDetails = new HashMap();
+ private Transaction doWork;
+ splitWiseService (ArrayList users) {
+ for (User currentUser : users) {
+ int id = currentUser.getId();
+ UserDetails.put(id, currentUser);
+ }
+ doWork = new Transaction();
+ }
+
+ void show () {
+ double total = 0;
+ HashMap oweData = doWork.getOweData();
+ for (String key : oweData.keySet()) {
+ Owe oweRecord = oweData.get(key);
+ String [] users = key.split("-");
+ int user1Id = Integer.parseInt(users[0]);
+ int user2Id = Integer.parseInt(users[1]);
+ User one = UserDetails.get(user1Id);
+ User two = UserDetails.get(user2Id);
+ double value = oweRecord.getamount();
+ if (value == 0)
+ continue;
+ if (value < 0)
+ System.out.println(two.getName() + " owes " + one.getName() + ": " + value*-1);
+ else if (value > 0)
+ System.out.println(one.getName() + " owes " + two.getName() + ": " + value);
+ total = total + value;
+ }
+ if (total == 0)
+ System.out.println("No balances");
+ }
+
+ void show (User givenUser) {
+ double total = 0;
+ HashMap oweData = doWork.getOweData();
+ for (String key : oweData.keySet()) {
+ Owe oweRecord = oweData.get(key);
+ String [] users = key.split("-");
+ int user1Id = Integer.parseInt(users[0]);
+ int user2Id = Integer.parseInt(users[1]);
+ User one = UserDetails.get(user1Id);
+ User two = UserDetails.get(user2Id);
+ if (one != givenUser && two != givenUser)
+ continue;
+ double value = oweRecord.getamount();
+ if (value == 0)
+ continue;
+ if (value < 0)
+ System.out.println(two.getName() + " owes " + one.getName() + ": " + value*-1);
+ else if (value > 0)
+ System.out.println(one.getName() + " owes " + two.getName() + ": " + value);
+ total = total + value;
+ }
+
+ if (total == 0)
+ System.out.println("No balances");
+ }
+
+ void expense (User payed, double amount, int numberOfUsers, ArrayList sharingUsers, String type, ArrayList division ) {
+ if (type.equalsIgnoreCase("equal")) {
+ doWork.expenseEqual(payed, amount, numberOfUsers, sharingUsers);
+ }
+ else if (type.equalsIgnoreCase("exact")) {
+
+ doWork.expenseExact(payed, amount, numberOfUsers, sharingUsers, division);
+ }
+ else if (type.equalsIgnoreCase("percent")) {
+
+ doWork.expensePercent(payed, amount, numberOfUsers, sharingUsers, division);
+ }
+ }
+
+ User getUser (int id) {
+ return UserDetails.get(id);
+ }
+
+// private int printOwedData (User currentUser) {
+// HashMap IOwe = currentUser.getOweData();
+// int total = 0;
+// for (User owedUser : IOwe.keySet()) {
+// Owe oweDetails = IOwe.get(owedUser);
+// if (oweDetails.getamount() > 0)
+// System.out.println(currentUser.getName() + " owes " + owedUser.getName() + ": " + oweDetails.getamount());
+// total = (int) (total + oweDetails.getamount());
+// }
+// return total;
+// }
+//
+// private int printOwetoMeData (User currentUser) {
+// HashMap IOwetoMe = currentUser.getOwetoMeData();
+// int total = 0;
+// for (User owedUser : IOwetoMe.keySet()) {
+// Owe owetoMeDetails = IOwetoMe.get(owedUser);
+// if (owetoMeDetails.getamount() > 0)
+// System.out.println(owedUser.getName() + " owes " + currentUser.getName() + ": " + owetoMeDetails.getamount());
+// total = (int) (total + owetoMeDetails.getamount());
+// }
+// return total;
+// }
+
+}
\ No newline at end of file