0

我试图找出一个好的(和快速的)解决以下问题的方法:

我有两个正在使用的模型,我们称它们为球员和团队。一个玩家可以在多个团队中,一个团队可以有多个玩家)。我正在努力在允许用户选择多个团队(复选框)的表单上创建 UI 元素。当用户选择(或取消选择)球队时,我想显示按球员分组的球队。

因此,例如:

  1. 如果所选球队没有相交的球员,则每个球队都有自己的部分。

  2. 如果用户选择了两支球队并且他们有相同的球员,那么会有一个部分包含两支球队和所有球员的名字。

  3. 如果 TEAM_A 有球员 [1, 2, 4, 5],而 TEAM_B 有球员 [1, 3, 5, 6]。会有以下部分:SECTION_X = [TEAM_A, TEAM_B, 1, 5], SECTION_Y = [TEAM_A, 2, 3], SECTION_Z = [TEAM_B, 3, 5]

我希望这很清楚。本质上,我想找到球员共同的球队并以此分组。我在想也许有一种方法可以通过导航二分图来做到这一点?不完全确定如何,我可能想多了。我希望通过在服务器上创建某种类型的数据结构并在客户端上使用它来做到这一点。我很想听听您的建议,并感谢您提供的任何帮助!

4

1 回答 1

0

一种解决方案是让每个玩家包装器跟踪它所在的选定球队

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来定位和删除团队。使用ListinTeamList假设 UI 将防止重复团队;使用 a 时要小心Set,因为确保两个包装器TeamLists具有相同的 hashValue 可能更困难(即,您可能需要采取措施确保两个包装器TeamLists以相同的顺序返回他们的团队 - 类似于 java LinkedHashSet会做的伎俩)

于 2014-10-09T04:35:50.547 回答