2013-08-27 152 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; 
} 
相关问题