Skip to content
This repository was archived by the owner on May 18, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/.metadata/
6 changes: 6 additions & 0 deletions SplitWise/.classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>
1 change: 1 addition & 0 deletions SplitWise/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/bin/
17 changes: 17 additions & 0 deletions SplitWise/.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>SplitWise</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
12 changes: 12 additions & 0 deletions SplitWise/.settings/org.eclipse.jdt.core.prefs
Original file line number Diff line number Diff line change
@@ -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
23 changes: 23 additions & 0 deletions SplitWise/src/Owe.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
58 changes: 58 additions & 0 deletions SplitWise/src/SplitWiseDrive.java
Original file line number Diff line number Diff line change
@@ -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<User> users = new ArrayList<User>();
users.add(new User("User1"));
users.add(new User("User2"));
users.add(new User("User3"));
users.add(new User("User4"));
HashMap<Integer, User> map = new HashMap<Integer, User>();
for (User usertoid : users)
map.put(usertoid.getId(), usertoid);

Queue<String> events = new LinkedList<String>();
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<User> al = new ArrayList<User>();
ArrayList<Integer> division = new ArrayList<Integer>();
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();
}
}





}
}
60 changes: 60 additions & 0 deletions SplitWise/src/Transaction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import java.util.ArrayList;
import java.util.HashMap;

public class Transaction {
private HashMap<String, Owe> oweData = new HashMap<String, Owe>();
protected void expenseEqual (User payed, double amount, int numberOfUsers, ArrayList<User> 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<User> sharingUser, ArrayList<Integer> 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<User> sharingUser, ArrayList<Integer> 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<String, Owe> getOweData () {
return oweData;
}

}
31 changes: 31 additions & 0 deletions SplitWise/src/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import java.util.HashMap;

public class User {
private String name;
private int id;
private static int counter = 1;
// private HashMap<User,Owe> IOwe = new HashMap<User,Owe>();
// private HashMap<User,Owe> OwetoMe = new HashMap<User,Owe>();

User (String name) {
this.name = name;
this.id = counter;
counter = counter + 1;;
}

int getId () {
return id;
}

String getName () {
return name;
}

// HashMap<User,Owe> getOweData () {
// return IOwe;
// }
//
// HashMap<User,Owe> getOwetoMeData () {
// return OwetoMe;
// }
}
106 changes: 106 additions & 0 deletions SplitWise/src/splitWiseService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import java.util.ArrayList;
import java.util.HashMap;

public class splitWiseService {
HashMap<Integer, User> UserDetails = new HashMap<Integer, User>();
private Transaction doWork;
splitWiseService (ArrayList<User> users) {
for (User currentUser : users) {
int id = currentUser.getId();
UserDetails.put(id, currentUser);
}
doWork = new Transaction();
}

void show () {
double total = 0;
HashMap<String, Owe> 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<String, Owe> 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<User> sharingUsers, String type, ArrayList<Integer> 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<User,Owe> 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<User,Owe> 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;
// }

}