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