2013-08-27 150 views
0

所以我有一個HashMap內的ArrayList中如何檢查一個字符串是否是一個HashMap

HashMap<String, ArrayList<String> gMap = new HashMap<String, ArrayList<String>(); 

當有人創建了一個組,組長添加到HashMap中的鍵,然後所有的組內用戶添加到ArrayList

gMap.get(groupLeader).add(user); 

我試圖讓這個只有班組長被允許邀請的球員,但如果一個球員是不屬於任何團體的一部分,並邀請其他用戶則組會自動創建,玩家將成爲組長。

所以,通常我會只是這樣做

for(ArrayList<String> list : gMap.values()){ 
    if(list.contains(user)){ 
     //do something since the player is not part of the list 
    } 
} 

但我不能這樣做,因爲可能有多個的ArrayList,所以即使用戶沒有一個ArrayList中的一部分,但這並不意味着他們不是活得在另一個裏面。

所以我很好奇,我將如何檢查所有的arrayLists,並做一些事情,只有當用戶不屬於他們中的任何一員。

+0

獲取所有'ArrayList'值並檢查它們。看起來像你已經在做... –

+0

遍歷你的地圖元素,然後搜索每個地圖項的列表。 –

+0

如果您關心性能和可伸縮性,您可能需要分別考慮播放器屬於哪個組(如果有的話)。然後你在O(1)中得到你正在尋找的答案,但你將不得不處理同步問題。 – pamphlet

回答

0

使用boolean值,您只更改列表中包含用戶的值,如果列表中包含break,則返回break

boolean notInAnyList = true; 
for(ArrayList<String> list : gMap.values()){ 
    if(list.contains(user)){ 
     notInAnyList = false; 
     break; // No point in iterating any further 
    } 
} 

if (notInAnyList) { 
    // Handle user not being in any of the lists here 
} 
0

因此,這裏是一個代碼示例

boolean userIsPartOfGroup = false 
for(ArrayList<String> list : gMap.values()){ 
    if(list.contains(user)){ 
     userIsPartOfGroup = true; 
     break; 
    } 
} 
if(!userIsPartOfGroup){ 
gMap.add(user).add(new ArrayList(user)); 
} 
4

你實際上是在創造一個Multimap(一鍵映射到相應值的集合)的數據結構,在這裏,你會發現,如果你使用一個直接你不必像現在一樣重新發明輪子。 Guava定義了一個非常好的Multimap interface,其中包含一個存儲所需數據的ArrayListMultimap,並有一個containsValue()方法,可以乾淨地完成您所需的任務。正如其他人所提到的,包含對列表的檢查很慢,如果您實際上不關心訂單,則可以使用HashMultimap更有效地執行這些檢查,如果您真的這麼做,則可以使用HashMultimap

如果你還沒有使用番石榴,你錯過了 - 它提供了無數優秀的實用工具和良好的做法。

0

首先,我會用一組,而不是一個列表(Java 7的語法):

Map<String, Set<String> gMap = new HashMap<>(); 

當我明白你的目標吧,這可能是一個解決方案:

if (isLeader(groupLeader, gMap)) { 
    gMap.get(groupLeader).add(user); 
} else if (isMember(groupLeader, gMap)) { 
    throw new UnsupportedOperationException("Member " + groupLeader + " is not a leader and must not invite " + user); 
} else { 
    addNewGroup(groupLeader, gMap).add(user); 
} 

這裏有輔助方法:

private boolean isLeader(String player, Map<String, Set<String> gMap) { 
    return gMap.keys().contains(player); 
} 

private boolean isMember(String player, Map<String, Set<String> gMap) { 
    for (Set<String> members : gMap.values()) { 
    if (members.contains(player)) { 
     return true; 
    } 
    } 
    return false; 
} 

private Set<String> addNewGroup(String leader, Map<String, Set<String> gMap) { 
    Set<String> players = new HashSet<>(); 
    gmap.put(leader, players); 
    return players; 
} 
相關問題