diff --git a/splitwise/.idea/description.html b/splitwise/.idea/description.html
new file mode 100644
index 0000000..db5f129
--- /dev/null
+++ b/splitwise/.idea/description.html
@@ -0,0 +1 @@
+Simple Java application that includes a class with main() method
\ No newline at end of file
diff --git a/splitwise/.idea/misc.xml b/splitwise/.idea/misc.xml
new file mode 100644
index 0000000..c2994d4
--- /dev/null
+++ b/splitwise/.idea/misc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/splitwise/.idea/modules.xml b/splitwise/.idea/modules.xml
new file mode 100644
index 0000000..eb46664
--- /dev/null
+++ b/splitwise/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/splitwise/.idea/project-template.xml b/splitwise/.idea/project-template.xml
new file mode 100644
index 0000000..1f08b88
--- /dev/null
+++ b/splitwise/.idea/project-template.xml
@@ -0,0 +1,3 @@
+
+ IJ_BASE_PACKAGE
+
\ No newline at end of file
diff --git a/splitwise/.idea/uiDesigner.xml b/splitwise/.idea/uiDesigner.xml
new file mode 100644
index 0000000..e96534f
--- /dev/null
+++ b/splitwise/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/splitwise/.idea/workspace.xml b/splitwise/.idea/workspace.xml
new file mode 100644
index 0000000..abcf191
--- /dev/null
+++ b/splitwise/.idea/workspace.xml
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ DEFINITION_ORDER
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1569162525728
+
+
+ 1569162525728
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/splitwise/out/production/splitwise/com/test/Driver.class b/splitwise/out/production/splitwise/com/test/Driver.class
new file mode 100644
index 0000000..d00156e
Binary files /dev/null and b/splitwise/out/production/splitwise/com/test/Driver.class differ
diff --git a/splitwise/out/production/splitwise/com/test/models/User.class b/splitwise/out/production/splitwise/com/test/models/User.class
new file mode 100644
index 0000000..82c73f0
Binary files /dev/null and b/splitwise/out/production/splitwise/com/test/models/User.class differ
diff --git a/splitwise/out/production/splitwise/com/test/services/ShowBalanceService.class b/splitwise/out/production/splitwise/com/test/services/ShowBalanceService.class
new file mode 100644
index 0000000..01d9dc0
Binary files /dev/null and b/splitwise/out/production/splitwise/com/test/services/ShowBalanceService.class differ
diff --git a/splitwise/out/production/splitwise/com/test/services/SplitWiseService.class b/splitwise/out/production/splitwise/com/test/services/SplitWiseService.class
new file mode 100644
index 0000000..fb1ac23
Binary files /dev/null and b/splitwise/out/production/splitwise/com/test/services/SplitWiseService.class differ
diff --git a/splitwise/splitwise.iml b/splitwise/splitwise.iml
new file mode 100644
index 0000000..d5c0743
--- /dev/null
+++ b/splitwise/splitwise.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/splitwise/src/com/test/Driver.java b/splitwise/src/com/test/Driver.java
new file mode 100644
index 0000000..3ff688b
--- /dev/null
+++ b/splitwise/src/com/test/Driver.java
@@ -0,0 +1,31 @@
+package com.test;
+import com.test.models.User;
+import com.test.services.SplitWiseService;
+
+import java.util.*;
+
+public class Driver {
+
+ public static void main(String[] args) {
+ SplitWiseService splitWiseService=new SplitWiseService();
+ Scanner in=new Scanner(System.in);
+
+ //Initialise Users
+ int noOfUsers=in.nextInt();
+ List users=new ArrayList();
+ for(int i=0;i> expenseTracker)
+ {
+ boolean noData=true;
+
+ for (Map.Entry mapElement : expenseTracker.entrySet()) {
+ User user = (User)mapElement.getKey();
+ HashMap userBalance = (HashMap)mapElement.getValue();
+ if(userBalance.size()>0)
+ {
+ for (Map.Entry e : userBalance.entrySet()) {
+ User otherUser = (User)e.getKey();
+ int amount = (int)e.getValue();
+ if(amount>0) {
+ System.out.println(otherUser.getName() + " owes " + user.getName() +": "+amount);
+ }
+ }
+ noData=false;
+
+ }
+ }
+
+ if(noData)
+ {
+ System.out.println("No balances");
+ }
+ }
+ void showUserBalance(HashMap> expenseTracker, User uid)
+ {
+ if(expenseTracker.get(uid).size()>0)
+ {
+ for (Map.Entry mapElement : expenseTracker.get(uid).entrySet())
+ {
+ User otherUser = (User)mapElement.getKey();
+ int amount = (int)mapElement.getValue();
+ if(amount>0) {
+ System.out.println(otherUser.getName() + " owes " + uid.getName() +": "+amount);
+ }
+ else
+ {
+ System.out.println(uid.getName() + " owes " + otherUser.getName() +": "+-amount);
+ }
+ }
+ }
+ else
+ {
+ System.out.println("No balances");
+ }
+ }
+}
diff --git a/splitwise/src/com/test/services/SplitWiseService.java b/splitwise/src/com/test/services/SplitWiseService.java
new file mode 100644
index 0000000..55e7629
--- /dev/null
+++ b/splitwise/src/com/test/services/SplitWiseService.java
@@ -0,0 +1,113 @@
+package com.test.services;
+import com.test.models.User;
+
+import java.util.*;
+
+public class SplitWiseService {
+ Map usersMap=new HashMap();
+ HashMap> expenseTracker=new HashMap>();
+
+ public void setUsers(List users) {
+ for(User user:users)
+ {
+ usersMap.put(user.getUid(),user);
+ expenseTracker.put(user,new HashMap());
+ }
+ }
+
+ public void splitBalance(String command) {
+ String[] expensedata=command.split(" ");
+ String paidUser=expensedata[1];
+ int totalPaid=Integer.parseInt(expensedata[2]);
+ int usersInvolved=Integer.parseInt(expensedata[3]);
+
+ if (expensedata[3+usersInvolved+1].equals("EQUAL"))
+ {
+ for (int i=1;i<=usersInvolved;i++)
+ {
+ updateExpenses(paidUser,expensedata[3+i],totalPaid/usersInvolved);
+ }
+ }
+ else if(expensedata[3+usersInvolved+1].equals("EXACT"))
+ {
+ if(isValidCommand(expensedata,"EXACT",usersInvolved))
+ {
+ for (int i=1;i<=usersInvolved;i++)
+ {
+ updateExpenses(paidUser,expensedata[3+i],Integer.parseInt(expensedata[3+usersInvolved+1+i]));
+ }
+ }
+ else {
+ System.out.println("Given Values are not equals to Total amount paid");
+ }
+ }
+ else if(expensedata[3+usersInvolved+1].equals("PERCENT"))
+ {
+ if(isValidCommand(expensedata,"PERCENT",usersInvolved)) {
+ for (int i = 1; i <= usersInvolved; i++) {
+ updateExpenses(paidUser, expensedata[3 + i], (totalPaid * Integer.parseInt(expensedata[3 + usersInvolved + 1 + i])) / 100);
+ }
+ }
+ else
+ {
+ System.out.println("Given Percentages are not 100%");
+ }
+ }
+
+ }
+ public void executeCommand(String command)
+ {
+ if(command.contains("SHOW"))
+ {
+ ShowBalanceService showBalanceService=new ShowBalanceService();
+ if(command.split(" ").length>1)
+ {
+ showBalanceService.showUserBalance(expenseTracker,usersMap.get(command.split(" ")[1]));
+ }
+ else
+ {
+ showBalanceService.showBalance(expenseTracker);
+ }
+ }
+ else
+ {
+ splitBalance(command);
+ }
+ }
+
+ public void updateExpenses(String paidUser,String oweUser,int amount)
+ {
+ if(!paidUser.equals(oweUser)) {
+ if (!expenseTracker.get(usersMap.get(paidUser)).containsKey(usersMap.get(oweUser))) {
+ expenseTracker.get(usersMap.get(paidUser)).put(usersMap.get(oweUser), amount);
+ } else {
+ expenseTracker.get(usersMap.get(paidUser)).put(usersMap.get(oweUser), expenseTracker.get(usersMap.get(paidUser)).get(usersMap.get(oweUser)) + amount);
+ }
+ if (!expenseTracker.get(usersMap.get(oweUser)).containsKey(usersMap.get(paidUser))) {
+ expenseTracker.get(usersMap.get(oweUser)).put(usersMap.get(paidUser), -amount);
+ } else {
+ expenseTracker.get(usersMap.get(oweUser)).put(usersMap.get(paidUser), expenseTracker.get(usersMap.get(oweUser)).get(usersMap.get(paidUser)) - amount);
+ }
+ }
+ }
+
+ boolean isValidCommand(String expensedata[],String expenseType,int usersInvolved)
+ {
+ int sum=0;
+ for(int i=1;i<=usersInvolved;i++)
+ {
+ sum+=Integer.parseInt(expensedata[3+usersInvolved+1+i]);
+ }
+ if(expenseType.equals("EXACT"))
+ {
+ return sum==Integer.parseInt(expensedata[2]);
+ }
+ else if(expenseType.equals("PERCENT"))
+ {
+ return sum==100;
+ }
+ return false;
+ }
+
+
+}