根据 value 设置到排行榜中
(int hash, BConcurrentKey keyHint, long roleId, Bean value)
| 267 | * 根据 value 设置到排行榜中 |
| 268 | */ |
| 269 | @RedirectHash(ConcurrentLevelSource = "getConcurrentLevel(keyHint.getRankType())") |
| 270 | public RedirectFuture<Long> updateRank(int hash, BConcurrentKey keyHint, long roleId, Bean value) { |
| 271 | beanFactory.register(value); |
| 272 | var outExist = new OutObject<BRankValue>(); |
| 273 | var rank = _removeRank(hash, keyHint, roleId, outExist); |
| 274 | int maxCount = getComputeCount(keyHint.getRankType()); |
| 275 | // insert if in rank. 使用binarySearch会造成相同分数不稳定。 |
| 276 | for (int i = 0; i < rank.getRankList().size(); ++i) { |
| 277 | var c = compactor.compare(rank.getRankList().get(i).getDynamic().getBean(), value); |
| 278 | if (c < 0) { |
| 279 | BRankValue tempVar = new BRankValue(); |
| 280 | tempVar.setRoleId(roleId); |
| 281 | tempVar.getDynamic().setBean(value); |
| 282 | rank.getRankList().add(i, tempVar); |
| 283 | if (rank.getRankList().size() > maxCount) { |
| 284 | rank.getRankList().remove(rank.getRankList().size() - 1); |
| 285 | } |
| 286 | return RedirectFuture.finish(0L); |
| 287 | } |
| 288 | } |
| 289 | // A: 如果排行的Value可能减少,那么当它原来存在,但现在处于队尾时,不要再进榜。 |
| 290 | // 因为此时可能存在未进榜但比它大的Value。 |
| 291 | // B: 但是在进榜玩家比榜单数量少的时候,如果不进榜,队尾的玩家更新还在队尾就会消失。 |
| 292 | if (rank.getRankList().size() < getRankSize(keyHint.getRankType()) |
| 293 | || (rank.getRankList().size() < maxCount && null == outExist.value)) { |
| 294 | BRankValue tempVar2 = new BRankValue(); |
| 295 | tempVar2.setRoleId(roleId); |
| 296 | tempVar2.getDynamic().setBean(value); |
| 297 | rank.getRankList().add(tempVar2); |
| 298 | } |
| 299 | return RedirectFuture.finish(0L); |
| 300 | } |
| 301 | |
| 302 | private BRankList merge(BRankList left, BRankList right) { |
| 303 | BRankList result = new BRankList(); |