84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
如玩家004打败排名为2的002玩家,排行榜将变成
数据结构为Map<排名,玩家ID> thks!!
走同样的路,发现不同的人生
不使用map或list,不論是ArrayList還是LinkedList,因為ArrayList相當於數組,排名變化需要更新大量的元素,而LinkedList雖然插入刪除比較方便,但是因為不能使用二分查找,要查找到變更後的位置需要遍歷。比較好的實作方式是使用平衡二元樹,或是直接使用redis中的sortset
為什麼要用map?這樣每次都要把插入名次之後的所有資料做調整,用list不行麼?使用list.add(int,object)
要排名肯定有一個類似分數的東西,如果不頻繁變動,放list裡每次按分數排序就可以了。如果名次變動比較頻繁或玩家比較多,維護一個最大堆。
排名m的打敗排名為n,排行榜變化 大概意思是排名n至m-1的全部各增加1,然後原來那m的排名換成n。 如果在資料庫,用sql分兩次很好處理。如果是其他文字儲存的寫個循環增加1也很好處理
這種功能我有做過 以前我用的是ConcurrentSkipListMap<排名, uid>,當然如果你沒有並發需求的話也可以用TreeMap 每個玩家有一個排名值,因為排名變化只涉及到兩個玩家,只用更新兩個玩家的排名值就可以了:
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);
java
int 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)
map.subMap(from, to)
排名固定的嘛,直接把兩位玩家的key值換一下..
不使用map或list,不論是ArrayList還是LinkedList,因為ArrayList相當於數組,排名變化需要更新大量的元素,而LinkedList雖然插入刪除比較方便,但是因為不能使用二分查找,要查找到變更後的位置需要遍歷。比較好的實作方式是使用平衡二元樹,或是直接使用redis中的sortset
為什麼要用map?這樣每次都要把插入名次之後的所有資料做調整,用list不行麼?使用list.add(int,object)
要排名肯定有一個類似分數的東西,如果不頻繁變動,放list裡每次按分數排序就可以了。如果名次變動比較頻繁或玩家比較多,維護一個最大堆。
排名m的打敗排名為n,排行榜變化
大概意思是排名n至m-1的全部各增加1,然後原來那m的排名換成n。
如果在資料庫,用sql分兩次很好處理。如果是其他文字儲存的寫個循環增加1也很好處理
這種功能我有做過
以前我用的是
ConcurrentSkipListMap<排名, uid>
,當然如果你沒有並發需求的話也可以用TreeMap
每個玩家有一個排名值,因為排名變化只涉及到兩個玩家,只用更新兩個玩家的排名值就可以了:
用這個的好處是查找某一段連續的排名(比如說查找某個玩家以及他前面幾名)很快:
map.subMap(from, to)
排名固定的嘛,直接把兩位玩家的key值換一下..