[英]How to modify HashMaps according to values
假設我有一個HashMap<String, Integer>
包含用戶名及其在隊列或行中作為 int 的位置。 我將如何從隊列中刪除用戶並隨后更新后面用戶的所有值?
我找到了一種我認為應該可行的方法。 @Rias,感謝對並發 hashMaps 的指導,它提供了一種完成我面臨的相同任務的方法。
public void removeFromQueue(String user) {
if (queueMap.containsKey(user)) {
int userPlace = queueMap.get(user);
for (String currentser : queueMap.keySet()) {
if (queueMap.get(currentUser) > userPlace) {
queueMap.put(user, queueMap.get(currentUser) - 1);
}
}
}
}
自我回答可以改進。 最明顯的是,當不需要時(因為我們正在迭代),您正在為每個條目進行兩次地圖查找。 現在還有方便的Map.replaceAll
方法。 所以也許:
public void removeFromQueue(String user) {
Integer userPlace = queueMap.get(user);
if (userPlace != null) {
queueMap.replaceAll((k, v) -> v>userPlace ? v-1 : v);
}
}
你可以這樣做:
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {
static Map<String, Integer> queueMap = new LinkedHashMap<String, Integer>();
public static void main(String[] args) {
queueMap.put("Arvind", 5);
queueMap.put("Avinash", 6);
queueMap.put("Kumar", 7);
queueMap.put("Lightcaster", 8);
queueMap.put("Stackoverflow", 9);
System.out.println("Before: " + queueMap);
removeFromQueue("Kumar");
System.out.println("After: " + queueMap);
}
static void removeFromQueue(String user) {
final Integer userPlace = queueMap.get(user);
if (userPlace != null) {
queueMap.replaceAll((k, v) -> v > userPlace ? v - 1 : v);
queueMap.remove(user);
}
}
}
輸出:
Before: {Arvind=5, Avinash=6, Kumar=7, Lightcaster=8, Stackoverflow=9}
After: {Arvind=5, Avinash=6, Lightcaster=7, Stackoverflow=8}
我希望我沒有遺漏任何東西,為什么不能對所有用戶名使用簡單的ArrayList<String>
?
該列表將按用戶的索引排序,這相當於您地圖中的值。 此外,如果您刪除其索引為i
的用戶,則所有具有 index > i
的用戶將根據需要進行重組(刪除后,索引為i + 1
的用戶的新索引將為i
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.