游戏排行榜中的插队排名如何实现?

发布于 2022-09-01 06:09:04 字数 679 浏览 19 评论 0

排名玩家ID
1001
2002
3003
4004
5005

如玩家004打败排名为2的002玩家,排行榜将变成

排名玩家ID
1001
2004
3002
4003
5005

数据结构为Map<排名,玩家ID>
thks!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

南风起 2022-09-08 06:09:04

不使用map或list,不论是ArrayList还是LinkedList,因为ArrayList相当于数组,排名变化需要更新大量的元素,而LinkedList虽然插入删除比较方便,但是因为不能使用二分查找,要查找到变更后的位置需要遍历。比较好的实现方式是使用平衡二叉树,或者直接使用redis中的sortset

谁的年少不轻狂 2022-09-08 06:09:04

为什么要用map?这样每次都要把插入名次之后的所有数据做调整,用list不行么?使用list.add(int,object)

小耗子 2022-09-08 06:09:04

要排名肯定有一个类似分数的东西,如果不频繁变动,放list里每次按分数排序就可以了。如果名次变动比较频繁或者玩家比较多,维护一个最大堆。

兲鉂ぱ嘚淚 2022-09-08 06:09:04

排名m的打败排名为n,排行榜变化
大概意思就是排名n至m-1的全部各增加1,然后原来那m的排名换成n。
如果在数据库,用sql分两次很好处理。如果是其他文本储存的写个循环增加1也很好处理

梦途 2022-09-08 06:09:04

这种功能我做过
以前我用的是ConcurrentSkipListMap<排名, uid>,当然如果你没有并发需求的话也可以用TreeMap
每个玩家有一个排名值,因为排名变化只涉及到两个玩家,只用更新两个玩家的排名值就可以了:

javaint user1OldRank = user1.rank;
int user2OldRank = user2.rank;
user1.rank = user2OldRank;
user2.rank = user1OldRank;

map.put(user1.rank, user1.uid);
map.put(user2.rank, user2.uid);

用这个的好处是查找某一段连续的排名(比如说查找某个玩家以及他前面几名)很快:map.subMap(from, to)

淡淡離愁欲言轉身 2022-09-08 06:09:04

排名固定的嘛,直接把两位玩家的key值换一下..

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文