我試圖模擬多個玩家可以提交遊戲分數的遊戲板。按排序順序存儲條目並檢索條目周圍的條目
POJO即, Entry.java代表排行榜中的一個條目。 請注意重寫equals()方法。
位置在排行榜的位置,1爲具有 最高的用戶分值
public class EntryTreeMapOption {
private String uid;
private int score;
private int position;
public EntryTreeMapOption(String uid, int score) {
this.uid = uid;
this.score = score;
}
public EntryTreeMapOption() {
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uid == null) ? 0 : uid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EntryTreeMapOption other = (EntryTreeMapOption) obj;
if (uid == null) {
if (other.uid != null)
return false;
} else if (!uid.equals(other.uid))
return false;
return true;
}
@Override
public String toString() {
return "Entry [uid=" + uid + ", score=" + score + ", position=" + position + "]";
}}
該遊戲鍵盤類有兩個方法:
- submitScore(字符串uid,int score)每個玩家都會調用這個方法將他的分數提交給遊戲棋盤。有每位玩家/用戶只有一項,因此,如果如果用戶是在排行榜玩家調用此方法多次,他的最新得分存儲
- getLeaderBoard(字符串UID)
用戶後立即最大的兩個條目(即是正上方 用戶在領先的用戶),用戶自己的條目,最大的兩個條目,返回具有 更大的成績比用戶在排行榜
e.g:
The leader board is :
Entry [uid=user1, score=14, position=1]
Entry [uid=user2, score=8, position=2]
Entry [uid=user3, score=7, position=3]
Entry [uid=user4, score=7, position=3]
Entry [uid=user5, score=4, position=4]
Entry [uid=user6, score=3, position=5]
Entry [uid=user7, score=3, position=5]
Entry [uid=user8, score=1, position=6]
For user5, entries returned should be :
Entry [uid=user3, score=7, position=3]
Entry [uid=user4, score=7, position=3]
Entry [uid=user5, score=4, position=4]
Entry [uid=user6, score=3, position=5]
Entry [uid=user7, score=3, position=5]
For user4, entries returned should be :
Entry [uid=user1, score=14, position=1]
Entry [uid=user2, score=8, position=2]
Entry [uid=user4, score=7, position=3]
Entry [uid=user5, score=4, position=4]
Entry [uid=user6, score=3, position=5]
For user6, entries returned should be :
Entry [uid=user4, score=7, position=3]
Entry [uid=user5, score=4, position=4]
Entry [uid=user6, score=3, position=5]
Entry [uid=user8, score=1, position=6]
For user7, entries returned should be :
Entry [uid=user4, score=7, position=3]
Entry [uid=user5, score=4, position=4]
Entry [uid=user7, score=3, position=5]
Entry [uid=user8, score=1, position=6]
我最初的方法是使用一個TreeMap,替代討論here。
public class GameDefault2 {
private TreeMap<EntryMapOption, String> leaderBoardEntryUserMap;
{
leaderBoardEntryUserMap = new TreeMap<>(Comparator.comparingInt(EntryTreeMapOption::getScore).reversed()
.thenComparing(EntryTreeMapOption::getUid));
}
@Override
public void submitScore(String uid, int score) {
EntryMapOption newEntry = new EntryMapOption(uid, score);
leaderBoardEntryUserMap.put(newEntry, uid);
}
@Override
public List<EntryMapOption> getLeaderBoard(String uid) {
System.out.println("---------Current leader board---------");
leaderBoardEntryUserMap.keySet().forEach(System.out::println);
List<EntryMapOption> userEntryList = leaderBoardEntryUserMap.entrySet().stream()
.filter(entry -> uid.equalsIgnoreCase(entry.getKey().getUid())).map(Map.Entry::getKey)
.collect(Collectors.toList());
if (userEntryList == null || userEntryList.isEmpty())
return Collections.emptyList();
// Incomplete and error prone
EntryMapOption userEntry = userEntryList.get(0);
List<EntryMapOption> entriesOptionTwo = new ArrayList<>();
entriesOptionTwo.add(leaderBoardEntryUserMap.higherKey(userEntry));
entriesOptionTwo.add(userEntry);
entriesOptionTwo.add(leaderBoardEntryUserMap.lowerKey(userEntry));
return entriesOptionTwo;
}
}
與上面的代碼的問題:
- 當(理想地,submitScore期間()),以及如何應在 '位置' 來計算。雖然它用於鍵,但我想知道Map.compute()是否能以任何方式提供幫助!
- 檢查下面的代碼//不完整和容易出錯的註釋 雖然'higherKey()'和'lowerKey()'來得方便,但我不確定如何使用它們來選擇固定數量的條目特別是進入
*****編輯-1 ****** @霍爾格的修復解決了以下問題
- 我無法弄清楚如何解決平等之間的矛盾( )和compare()。這造成缺少項
'Comparator.comparingInt(EntryMapOption :: getScore).reversed()。thenComparingInt(EntryMapOption ::的getuid)'... – Holger
@Holger解決了第一個問題:) 更新原始比較代碼。 –
您不得修改影響其查找邏輯的關鍵字的屬性,例如「HashMap」時的哈希碼或「TreeMap」情況下的排序屬性。如果它具有自然順序,則在兩種情況下都不能改變。您必須首先移除並在修改後重新添加,或者執行批量操作以創建新的「Map」。關於'higherKey'和'lowerKey',目前還不清楚你的問題在哪裏。 – Holger