Skip to content

Commit 61183e9

Browse files
committed
HARD
1 parent 59857ed commit 61183e9

File tree

8 files changed

+124
-40
lines changed

8 files changed

+124
-40
lines changed

.idea/workspace.xml

Lines changed: 27 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

low-level-design/src/main/java/com/thealgorithm/splitwise/BalanceSheet.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,7 @@
33
/**
44
* @author: Subham Santra
55
*/
6-
public abstract class BalanceSheet {}
6+
public abstract class BalanceSheet {
7+
8+
abstract void update(User paidBy, User borrower, Double amount);
9+
}

low-level-design/src/main/java/com/thealgorithm/splitwise/BalanceSheetEntry.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.thealgorithm.splitwise;
22

3+
import lombok.AllArgsConstructor;
34
import lombok.Data;
45

56
/**
67
* @author: Subham Santra
78
*/
89
@Data
10+
@AllArgsConstructor
911
public class BalanceSheetEntry {
1012
User owner;
1113
User other;

low-level-design/src/main/java/com/thealgorithm/splitwise/Group.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
import java.util.ArrayList;
44
import java.util.List;
55
import lombok.Data;
6+
import lombok.ToString;
67

78
/**
89
* @author: Subham Santra
910
*/
1011
@Data
12+
@ToString(onlyExplicitlyIncluded = true)
1113
public class Group {
12-
String name;
13-
List<User> users;
14+
@ToString.Include String name;
15+
@ToString.Include List<User> users;
1416
ResolverStrategy resolverStrategy;
1517
GroupBalanceSheet groupBalanceSheet;
1618
GroupExpenseValidator groupExpenseValidator;
@@ -21,6 +23,7 @@ public Group(String name) {
2123
resolverStrategy = null;
2224
groupBalanceSheet = new GroupBalanceSheet();
2325
groupExpenseValidator = new GroupExpenseValidator(this);
26+
groupBalanceSheet.setGroup(this);
2427
}
2528

2629
void changeDebtResolver(DebtResolverType debtResolverType) {
@@ -29,12 +32,27 @@ void changeDebtResolver(DebtResolverType debtResolverType) {
2932

3033
void add(User user) {
3134
this.users.add(user);
35+
this.getGroupBalanceSheet().add(user);
3236
}
3337

3438
void add(Expense expense) throws UserIsNotPartOfGroupException, InvalidSplitException {
3539
groupExpenseValidator.validate(expense);
3640

37-
// add expense now
41+
Double totalAmount = expense.getTotalAmount();
42+
for (UserSplit eachUserSplit : expense.getUserSplits()) {
43+
User user = eachUserSplit.getUser();
44+
Double shareAmount = eachUserSplit.getShareAmount();
45+
if (user.equals(expense.getPaidBy())) {
46+
double totalGetBack =
47+
user.getPersonalBalanceSheet().getTotalGetBack() + (totalAmount - shareAmount);
48+
user.getPersonalBalanceSheet().setTotalGetBack(totalGetBack);
49+
} else {
50+
PersonalBalanceSheet personalBalanceSheet = user.getPersonalBalanceSheet();
51+
Double totalOweAmount = personalBalanceSheet.getTotalOwe() + eachUserSplit.getShareAmount();
52+
personalBalanceSheet.setTotalOwe(totalOweAmount);
53+
groupBalanceSheet.update(expense.getPaidBy(), user, eachUserSplit.getShareAmount());
54+
}
55+
}
3856
}
3957

4058
void resolve() throws OperationNotSupportedException {

low-level-design/src/main/java/com/thealgorithm/splitwise/GroupBalanceSheet.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.thealgorithm.splitwise;
22

3+
import java.util.HashMap;
34
import java.util.Map;
45
import lombok.Data;
56
import lombok.EqualsAndHashCode;
@@ -10,5 +11,37 @@
1011
@Data
1112
@EqualsAndHashCode(callSuper = true)
1213
public class GroupBalanceSheet extends BalanceSheet {
13-
Map<User, Map<User, BalanceSheetEntry>> balanceSheetEntryMap;
14+
private Group group;
15+
private Map<User, Map<User, BalanceSheetEntry>> balanceSheetEntryMap = new HashMap<>();
16+
17+
public void add(User user) {
18+
balanceSheetEntryMap.put(user, new HashMap<>());
19+
}
20+
21+
@Override
22+
void update(User paidBy, User borrower, Double amount) {
23+
update0(paidBy, borrower, amount);
24+
update0(borrower, paidBy, -amount);
25+
}
26+
27+
private void update0(User paidBy, User borrower, Double amount) {
28+
Map<User, BalanceSheetEntry> paidUserBalanceSheet = balanceSheetEntryMap.get(paidBy);
29+
paidUserBalanceSheet.putIfAbsent(borrower, new BalanceSheetEntry(paidBy, borrower, 0D));
30+
paidUserBalanceSheet
31+
.get(borrower)
32+
.setAmount(paidUserBalanceSheet.get(borrower).getAmount() + amount);
33+
}
34+
35+
public void print() {
36+
System.out.println("SHOWING BALANCESHEET FOR " + group.name);
37+
balanceSheetEntryMap.forEach(
38+
(user, map) -> {
39+
System.out.printf("BALANCE FOR %s\n", user);
40+
41+
map.forEach(
42+
(u, e) -> {
43+
System.out.printf("%s %s\n", u, e.getAmount());
44+
});
45+
});
46+
}
1447
}

low-level-design/src/main/java/com/thealgorithm/splitwise/Main.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,25 @@ public static void main(String[] args)
3737
picnicWala.add(
3838
Expense.builder()
3939
.paidBy(subham)
40-
.totalAmount(100D)
40+
.totalAmount(60D)
4141
.userSplits(
4242
List.of(
43-
UserSplit.builder().user(subham).shareAmount(33D).build(),
44-
UserSplit.builder().user(shyam).shareAmount(33D).build(),
45-
UserSplit.builder().user(ram).shareAmount(34D).build()))
43+
UserSplit.builder().user(subham).shareAmount(20D).build(),
44+
UserSplit.builder().user(shyam).shareAmount(20D).build(),
45+
UserSplit.builder().user(ram).shareAmount(20D).build()))
4646
.build());
47+
48+
picnicWala.add(
49+
Expense.builder()
50+
.paidBy(shyam)
51+
.totalAmount(60D)
52+
.userSplits(
53+
List.of(
54+
UserSplit.builder().user(subham).shareAmount(20D).build(),
55+
UserSplit.builder().user(shyam).shareAmount(20D).build(),
56+
UserSplit.builder().user(ram).shareAmount(20D).build()))
57+
.build());
58+
59+
picnicWala.getGroupBalanceSheet().print();
4760
}
4861
}
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.thealgorithm.splitwise;
22

3+
import java.util.HashMap;
34
import java.util.Map;
45
import lombok.Data;
56

@@ -8,7 +9,12 @@
89
*/
910
@Data
1011
public class PersonalBalanceSheet extends BalanceSheet {
11-
Double totalOwe;
12-
Double totalGetBack;
13-
Map<User, BalanceSheetEntry> balanceSheetEntryMap; // otherUser --> entry
12+
Double totalOwe = 0D;
13+
Double totalGetBack = 0D;
14+
Map<User, BalanceSheetEntry> balanceSheetEntryMap = new HashMap<>(); // otherUser --> entry
15+
16+
@Override
17+
void update(User paidBy, User borrower, Double amount) {
18+
19+
}
1420
}

low-level-design/src/main/java/com/thealgorithm/splitwise/User.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,22 @@
33
import java.util.ArrayList;
44
import java.util.List;
55
import lombok.Data;
6+
import lombok.EqualsAndHashCode;
7+
import lombok.ToString;
68

79
/**
810
* @author: Subham Santra
911
*/
1012
@Data
13+
@ToString(onlyExplicitlyIncluded = true)
14+
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
1115
public class User {
12-
String name;
13-
List<Group> groups;
14-
PersonalBalanceSheet personalBalanceSheet;
16+
@EqualsAndHashCode.Include
17+
@ToString.Include
18+
private String name;
19+
@ToString.Include
20+
private List<Group> groups;
21+
private PersonalBalanceSheet personalBalanceSheet;
1522

1623
public User(String name) {
1724
this.name = name;

0 commit comments

Comments
 (0)