![](/img/trans.png)
[英]How to save String object into an ArrayList and also remove the HashMap inside of this ArrayList<HashMap<String, String>>?
[英]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.