-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathLeaderboard.java
165 lines (151 loc) · 4.78 KB
/
Leaderboard.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import java.util.ArrayList;
import java.util.UUID;
/**
* @author Evelyn Ellis & Cam Osterholt
* @version v2.0
* Date: 10/23/2023
*/
//TODO: Determine when we need to sort list.
public class Leaderboard {
private ArrayList<LeaderboardMember> leaderboard;
private class LeaderboardMember {
private User user;
private int score;
public LeaderboardMember(User user, int score) {
setUser(user);
setScore(score);
}
private void setUser(User user) {
if(user != null)
this.user = user;
}
public User getUser() {
return this.user;
}
public int setScore(int score) {
if(score > -1)
this.score = score;
return this.score;
}
public int getScore() {
return this.score;
}
}
/**
* Initalizes a new leaderboard.
*/
public Leaderboard() {
leaderboard = new ArrayList<LeaderboardMember>();
}
/**
* Bubble sorts instance's Leaderboard.
* @return
*/
private boolean sortList(){
LeaderboardMember temp;
boolean swapped;
for(int i = 0; i < leaderboard.size() - 1; i++) {
swapped = false;
for(int j = 0; j < leaderboard.size() - i - 1; j++) {
if(leaderboard.get(j).getScore() < leaderboard.get(j + 1).getScore()) {
temp = leaderboard.get(j);
leaderboard.set(j, leaderboard.get(j + 1));
leaderboard.set(j + 1, temp);
swapped = true;
}
}
if(!swapped) return true; // Checks for final pass if sorted correctly.
}
return false;
}
public int getRank(UUID id) {
return getIndex(id) + 1;
}
public int getRank(User user){
return getIndex(user.getId()) + 1;
}
public int getRank() {
return getIndex(AppFacade.getInstance().getActiveUser().getId()) + 1;
}
/**
* Increments User score for one completed task.
* @param user User to update.
* @return User's current score.
* @author Cam Osterholt
*/
public int incrementScore(User user) {
return updateScore(user, 1);
}
/**
* Updates User score for an inputted number.
* @param user User to update.
* @return User's current score.
* @author Cam Osterholt
*/
public int updateScore(User user, int increment){
int index = getIndex(user.getId());
//User not found
if(index < 0) {
this.leaderboard.add(new LeaderboardMember(user, increment));
sortList();
return increment;
}
return updateScore(user.getId(), increment);
}
/**
* Updates User score for an inputted number.
* @param user User to update.
* @return User's current score.
* @author Cam Osterholt
*/
public int updateScore(UUID id, int increment) {
int index = getIndex(id);
//User not found, cannot initalize.
if(index < 0) {
return index;
}
LeaderboardMember lm = this.leaderboard.get(index);
return lm.setScore(lm.getScore() + increment);
}
/**
* Gets the top ranked users to a last value.
* @param lastScore Last ranked user to include in array
* @return Array with [UUID, score]
*/
public String[][] getTopRank(int lastScore){
sortList();
String[][] arr = new String[lastScore][2];
for(int i = 0; i < lastScore; i++) {
arr[i][0] = this.leaderboard.get(i).getUser().getId().toString();
arr[i][1] = String.valueOf(this.leaderboard.get(i).getScore());
}
return arr;
}
/**
* Formats the leaderboard to,
* FirstName LastName Score: {Score}
* @return String formatted for all
*/
public String toString() {
sortList();
String str = "";
for(LeaderboardMember lm : this.leaderboard) {
str += lm.getUser().getFirstName() + " " + lm.getUser().getLastName() + "\tScore: " + lm.getScore() + "\n";
}
return str;
}
/**
* Prints the leaderboard in order to console.
*/
public void print() {
System.out.print(toString());
}
private int getIndex(UUID id) {
sortList();
for(int i = 0; i < leaderboard.size(); i++) {
if(leaderboard.get(i).getUser().getId().equals(id))
return i;
}
return -1;
}
}