2014-10-08 60 views
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]

希望很清楚。基本上,我想找到球員有共同點和分組的球隊。我在想,也許有一種方法可以通過瀏覽雙向圖來實現這一點?不完全確定,儘管如此,我可能會推翻它。我希望通過在服務器上創建某種類型的數據結構並在客戶端上使用它來實現此目的。我很樂意聽取您的建議,並感謝您的幫助!

+0

你可能會得到很多的部分。考慮例如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

回答

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中檢索玩家包裝。對於每個玩家包裝,從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會做的伎倆)