如何检查字符串是否在hashmap内的arrayList中

时间:2013-08-27 18:37:42

标签: java arraylist hashmap

所以我有一个hashmap

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

当有人创建一个组时,组长会被添加到hashmap的键中,然后组内的所有用户都被添加到arraylist

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

我试图让它只允许小组领导者邀请玩家,但如果玩家不属于任何组并邀请其他用户,则会自动创建一个组并且该玩家成为组长。< / p>

所以,通常我会这样做

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

但我不能这样做,因为可能有多个arrayLists,所以即使用户不是一个arrayList的一部分,也不意味着他们不在另一个arrayList中。

所以我很好奇我将如何检查所有数组列表并仅在用户不属于任何数组时执行某些操作。

4 个答案:

答案 0 :(得分:4)

你实际上在这里创建了一个Multimap(值集合的键映射)数据结构,你会发现如果你直接使用它,你将不必重新发明轮子现在。 Guava定义了一个非常好的Multimap interface,包括一个存储所需数据的ArrayListMultimap,并且containsValue()方法可以干净地完成您的需要。正如其他人所提到的,包含对列表的检查速度很慢,如果您实际上并不关心订单,可以使用HashMultimap更有效地执行这些包含检查,如果您确实关注,则可以使用LinkedHashMultimap。< / p>

如果您还没有使用过番石榴,那么您就错过了它 - 它提供了无数优秀的实用工具和良好实践。

答案 1 :(得分:0)

使用boolean值,只更改列表中包含用户的值 - 如果是,则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
}

答案 2 :(得分: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));
}

答案 3 :(得分: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;
}