簡體   English   中英

如何檢查字符串是否在哈希圖中的arrayList中

[英]How to check if a string is in an arrayList inside a hashmap

所以我有一個哈希圖

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

當有人創建組時,將組長添加到哈希圖的鍵中,然后將組內的所有用戶添加到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,也並不意味着它們不在另一個arrayList中。

因此,我很想知道如何檢查所有arrayLists並僅在用戶不屬於其中任何一個的情況下執行某些操作。

您實際上是在這里創建一個Multimap (鍵到值的集合的映射)數據結構,並且您會發現,如果直接使用它,則無需像現在一樣重新發明輪子。 Guava定義了一個非常漂亮的Multimap interface ,包括一個用於存儲所需數據的ArrayListMultimap ,並且具有一個可以完全滿足您需要的containsValue()方法。 正如其他人所提到的,包含對列表的檢查速度很慢,如果您實際上並不關心訂單,則可以使用HashMultimap來更有效地執行包含檢查,如果您確實關心,則可以使用LinkedHashMultimap

而且,如果您還沒有使用Guava,那么您會錯過這里-它提供了無數的優秀實用程序和良好實踐。

使用一個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
}

所以這是一個代碼示例

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));
}

首先,我將使用集合而不是列表(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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM