一种解决方案是让每个玩家包装器跟踪它所在的选定球队
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
. 对于每个 player wrapper,检索Set<Player>
fromplayerSets
并从 set 中删除 player,然后将新团队添加到 wrappers TeamList
,检索Set<Player>
fromplayerSets
并将 player 添加到 set。
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
来定位和删除团队。使用List
inTeamList
假设 UI 将防止重复团队;使用 a 时要小心Set
,因为确保两个包装器TeamLists
具有相同的 hashValue 可能更困难(即,您可能需要采取措施确保两个包装器TeamLists
以相同的顺序返回他们的团队 - 类似于 java LinkedHashSet会做的伎俩)