0

所以我有一个哈希图

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

并且当有人创建组时,将组长添加到 hashmap 的 key 中,然后将组内的所有用户添加到 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
    }
}

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

所以我很好奇我将如何检查所有 arrayLists 并仅在用户不属于其中任何一个时才执行某些操作。

4

4 回答 4

4

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

如果你还没有使用 Guava,那么你就错过了——它提供了无数优秀的实用程序和良好实践。

于 2013-08-27T18:52:32.237 回答
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;
}
于 2013-08-27T19:03:22.557 回答
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
}
于 2013-08-27T18:41:28.273 回答
0

So here is a code sample

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));
}
于 2013-08-27T18:46:24.953 回答