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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
| public class LeaderboardSystem {
private final TreeSet<Player> leaderboard;
private final Map<String, Player> playerMap;
private final int maxSize;
public LeaderboardSystem(int maxSize) {
// 按分數降序排列,分數相同時按名稱升序
this.leaderboard = new TreeSet<>(
Comparator.comparing(Player::getScore, Comparator.reverseOrder())
.thenComparing(Player::getName)
);
this.playerMap = new ConcurrentHashMap<>();
this.maxSize = maxSize;
}
// 更新玩家分數
public void updateScore(String playerName, int score) {
synchronized (leaderboard) {
// 移除舊記錄
Player oldPlayer = playerMap.get(playerName);
if (oldPlayer != null) {
leaderboard.remove(oldPlayer);
}
// 添加新記錄
Player newPlayer = new Player(playerName, score, System.currentTimeMillis());
leaderboard.add(newPlayer);
playerMap.put(playerName, newPlayer);
// 保持排行榜大小
if (leaderboard.size() > maxSize) {
Player removed = leaderboard.pollLast();
playerMap.remove(removed.getName());
}
}
}
// 獲取排行榜
public List<Player> getLeaderboard() {
synchronized (leaderboard) {
return new ArrayList<>(leaderboard);
}
}
// 獲取前 N 名
public List<Player> getTopN(int n) {
synchronized (leaderboard) {
return leaderboard.stream()
.limit(n)
.collect(Collectors.toList());
}
}
// 獲取玩家排名
public int getPlayerRank(String playerName) {
synchronized (leaderboard) {
Player player = playerMap.get(playerName);
if (player == null) {
return -1;
}
return leaderboard.headSet(player, false).size() + 1;
}
}
// 獲取玩家分數
public int getPlayerScore(String playerName) {
Player player = playerMap.get(playerName);
return player != null ? player.getScore() : -1;
}
// 獲取分數範圍內的玩家
public List<Player> getPlayersInScoreRange(int minScore, int maxScore) {
synchronized (leaderboard) {
// 創建邊界對象
Player minPlayer = new Player("", minScore, 0);
Player maxPlayer = new Player("", maxScore, 0);
return leaderboard.subSet(maxPlayer, true, minPlayer, true)
.stream()
.filter(p -> p.getScore() >= minScore && p.getScore() <= maxScore)
.collect(Collectors.toList());
}
}
// 獲取玩家周圍的排名
public List<Player> getPlayersAround(String playerName, int radius) {
synchronized (leaderboard) {
Player player = playerMap.get(playerName);
if (player == null) {
return new ArrayList<>();
}
List<Player> result = new ArrayList<>();
// 獲取前面的玩家
NavigableSet<Player> before = leaderboard.headSet(player, false);
before.descendingSet().stream()
.limit(radius)
.forEach(result::add);
Collections.reverse(result);
// 添加當前玩家
result.add(player);
// 獲取後面的玩家
NavigableSet<Player> after = leaderboard.tailSet(player, false);
after.stream()
.limit(radius)
.forEach(result::add);
return result;
}
}
// 移除玩家
public boolean removePlayer(String playerName) {
synchronized (leaderboard) {
Player player = playerMap.remove(playerName);
if (player != null) {
return leaderboard.remove(player);
}
return false;
}
}
// 清空排行榜
public void clear() {
synchronized (leaderboard) {
leaderboard.clear();
playerMap.clear();
}
}
// 獲取統計信息
public LeaderboardStatistics getStatistics() {
synchronized (leaderboard) {
if (leaderboard.isEmpty()) {
return new LeaderboardStatistics(0, 0, 0, 0);
}
int totalPlayers = leaderboard.size();
int highestScore = leaderboard.first().getScore();
int lowestScore = leaderboard.last().getScore();
double averageScore = leaderboard.stream()
.mapToInt(Player::getScore)
.average()
.orElse(0.0);
return new LeaderboardStatistics(totalPlayers, highestScore, lowestScore, averageScore);
}
}
// 玩家類
public static class Player {
private final String name;
private final int score;
private final long timestamp;
public Player(String name, int score, long timestamp) {
this.name = name;
this.score = score;
this.timestamp = timestamp;
}
// Getters
public String getName() { return name; }
public int getScore() { return score; }
public long getTimestamp() { return timestamp; }
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Player player = (Player) obj;
return score == player.score &&
Objects.equals(name, player.name);
}
@Override
public int hashCode() {
return Objects.hash(name, score);
}
@Override
public String toString() {
return String.format("Player{name='%s', score=%d}", name, score);
}
}
// 統計信息
public static class LeaderboardStatistics {
private final int totalPlayers;
private final int highestScore;
private final int lowestScore;
private final double averageScore;
public LeaderboardStatistics(int totalPlayers, int highestScore, int lowestScore, double averageScore) {
this.totalPlayers = totalPlayers;
this.highestScore = highestScore;
this.lowestScore = lowestScore;
this.averageScore = averageScore;
}
// Getters
public int getTotalPlayers() { return totalPlayers; }
public int getHighestScore() { return highestScore; }
public int getLowestScore() { return lowestScore; }
public double getAverageScore() { return averageScore; }
}
}
|
留言討論