希望排行榜上的玩家不会减少

问题遇到的现象和发生背景

离线数仓,需要计算TOP10的玩家的排名,每天会取出分数前10的玩家作为TOP10。但有些玩家会被封号,被封号之后就会从TOP10名单里删除,这样一来TOP10的人数就会变少,变成九个,八个,七个。
现在希望一直能有10个玩家在榜上,想问有没有人遇见过类似的情况,有什么比较好的解决方案吗?

问题相关代码,请勿粘贴截图

无代码

运行结果及报错内容
我的解答思路和尝试过的方法

拿前30个玩家的分数,这样被删除后还可以顶上去,但存在极端情况,如果前30个也都被封号了,还是会少。

我想要达到的结果

希望一直能有10个玩家在榜上,麻烦大家来评论区聊聊自己的思路

可以在原有接口中添加一个过滤逻辑,对已经排序的数据筛选出有效账号列表(未封号的),然后取出前十条,如果对你有所帮助望采纳
实例代码如下:

//获取排好序的玩家列表playerList
List<Player> playerList = getPlayerList();
//筛选有效账号列表useablePlayerList
List<Player> useablePlayerList = playerList.stream().filter(player -> player.getIsValid = 1).collect(Collectors.toList());//getIsValid此处根据代码实际情况来定,为有效的标识

然后就可以对有效列表取出前十逻辑处理。

封号的时候,给一个消息队列,通知数据仓库那里,如果封的是排行榜前10的号,就调用重新计算一下排名。

反正都排序了,取10个也是取,取30也是取,都取一点呗

封号依据是什么?能不能在取排行TOP10之前把封号的数据都过滤掉再来排序?


果然,就怕你这个逻辑是排序后再封号,因为这就会涉及到要做一个循环处理,而且一开始必须全部把序号排了
全排序-取前10-循环(封号n人-补上n人)
当循环里,封号人数为0时跳出循环,或者无法补足10人时跳出循环(极端情况,全部排完还不够10人)


另外,为了节省开销,可以根据多次真实数据来计算一个概率,比如前30人完成TOP10的概率、前100人完成TOP10的概率....
然后得到一个最佳的区间,以后就优先用这个区间的来算,再增加一次检查,检查发现不对,再使用次佳的区间来算,以次类推,这样可以减少循环的次数

把封号的去掉重新拍就可以了吧,不过挺感兴趣的这是啥游戏,封号这么严重,前30都封号,封号就不参与排名即可,没啥难度。

获得TOP10的玩家的时候难道没有对所有玩家排序吗?

去掉封号的,排一下序不就行了?

1.你排序搞个筛选,把封号的去掉
2.或者你就排前30名这样简单粗暴。

是先排序再封号的,不可以做到在排序时就筛选掉封号的。(其中牵扯其他逻辑,我就不做详解了,结果就是只能先排序再封号)

建议将数据先存入redis,通过redis的特性来做。

逻辑些许的怪异, 大体就是只能存玩家和分数, 不能存状态(封号), 然后排序取出, 给出两个思路吧:

  1. 如果可以直接更新分数的话则封号玩家分数 * -1;
  2. 不可以的话则每天排序完成后同步100条数据到redis, 用zset, 同上逻辑分数 * -1, zset可以自动排序可以直接取出排名前10的玩家;

既然是离线数仓,那也不可能实时去算,你算30个和100个效率上也不会有区别,多算出一些,需要的时候取个top10不就得了