簡體   English   中英

如何根據值修改HashMaps

[英]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.

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