一種解決方案是讓每個玩家包裝跟蹤選定的團隊,這是
class PlayerWrapper {
Player player;
TeamList teamList;
}
class TeamList {
private List<Team> teams;
int hashValue = // hash value derived from teams list
void add(Team team) {
teams.add(team);
hashValue = // update hash value
}
}
然後保持玩家集的哈希表,和球員包裝的哈希表
HashTable<TeamList, Set<Player>> playerSets
HashTable<Player, PlayerWrapper> playerWrappers
當用戶選擇一個新團隊時,遍歷團隊的玩家並從playerWrappers
中檢索玩家包裝。對於每個玩家包裝,從playerSets
檢索Set<Player>
並從該集合中移除玩家,然後將新團隊添加到包裝TeamList
,從中檢索Set<Player>
並將玩家添加到集合中。
void updatePlayer(Team team, Player player) {
PlayerWrapper wrapper = playerWrappers.get(player);
Set<Player> set = playerSets.get(wrapper.teamList);
set.remove(player);
wrapper.teamList.add(team);
set = playerSets.get(wrapper.teamList);
set.add(player);
}
假設你正在使用的哈希集Set<Player>
這應該平均需要一定的時間來處理一個團隊的球員。取消選擇團隊的功能將與此相同,只不過您將從wrapper.teamList
中刪除該團隊而不是添加該團隊,並且您將通過TeamList
進行線性時間搜索以找到並刪除團隊。在TeamList
中使用List
假定UI將防止重複的團隊;請謹慎使用Set
,因爲要確保兩個包裝的TeamLists
具有相同的散列值可能會更困難(即您可能需要採取措施確保兩個包裝的TeamLists
以相同的順序返回其團隊 - 類似一個java LinkedHashSet會做的伎倆)
你可能會得到很多的部分。考慮例如4支隊伍,每支隊伍中有8個隊員:A = [1,2,3,4,5,6,7,8],B = [1,2,3,4,9,10,11,12] ,C = [1,2,5,6,9,10,13,14],D = [1,3,5,7,9,11,13,15]。現在,這些球員中的每一個都在不同的小組中,如果我理解正確,他們應該分別獲得自己的部分。這是打算? – 2014-10-18 17:03:31