簡體   English   中英

從 hashmap 對象中刪除值的有效方法

[英]Efficient way to delete values from hashmap object

我有 HashMap 對象包含一個鍵xyz與相應的值test-test1-test2

Map<String,String> map = new HashMap<String,String>(); 
map.put("x-y-z","test-test1-test2");
map.put("x1-y1-z1","test-test2-test3"); 

現在我有一個包含一些鍵的輸入字符串數組:

String[] rem={"x","x1"}

基於這個字符串數組,我想刪除 HashMap 值。

任何人都可以提供一種有效的方法來執行此操作嗎?

List remList = Arrays.asList(rem);
for (Iterator it = map.keySet().iterator(); it.hasNext();) {
    String key = (String) it.next();
    String[] tokens = key.split("-");
    for (int i = 0; i < tokens.length; i++) {
        String token = tokens[i];
        if (remList.contains(token)) {
            it.remove();
            break;
        }
     }
}

以及根據您對此答案的最新評論添加功能的更新版本:

private static Map getMapWithDeletions(Map map, String[] rem) {
    Map pairs = new HashMap();
    for (int i = 0; i < rem.length; i++) {
        String keyValue = rem[i];
        String[] pair = keyValue.split("@", 2);
        if (pair.length == 2) {
            pairs.put(pair[0], pair[1]);
        }
    }
    Set remList = pairs.keySet();
    for (Iterator it = map.keySet().iterator(); it.hasNext();) {
        String key = (String) it.next();
        String[] tokens = key.split("-");
        for (int i = 0; i < tokens.length; i++) {
            String token = tokens[i];
            if (remList.contains(token)) {
                it.remove();
                pairs.remove(token);
                break;
            }
        }
    }
    map.putAll(pairs);
    return map;
}

根據編輯過的問題進行編輯。

循環遍歷哈希圖的 keySet。 當您找到以 x 開頭的鍵時,您正在尋找將其從地圖中刪除。

類似的東西:

for(String[] key: map.keySet()){
   if(key.length>0 && x.equals(key[0])){
      map.remove(key);
    }
}

假設我理解正確,並且您想從地圖中刪除以“x-”和“x1-”開頭的所有內容(但不是“x1111-”,即使“x1”是“x1111”的前綴)和效率很重要,您可能想查看NavigableMap的實現之一,例如(例如) TreeMap

NavigableMaps保持它們的條目順序(默認情況下按自然鍵順序),並且可以非常有效地迭代和搜索。

它們還提供了subMap方法,它可以生成另一個 Map,其中包含指定范圍內的那些鍵。 重要的是,這個返回的 Map 是一個實時視圖,這意味着在這個地圖上的操作也會影響原始地圖。

所以:

NavigableMap<String,String> map = new TreeMap<String,String>(); 
// populate data
for (String prefixToDelete : rem) {
    // e.g. prefixToDelete = "x"
    String startOfRange = prefixToDelete + "-"; // e.g. x-
    String endOfRange = prefixToDelete + "`"; // e.g. x`; ` comes after - in sort order
    map.subMap(startOfRange, endOfRange).clear(); // MAGIC!
}

假設您的地圖很大, .subMap()應該比迭代每個 Map 條目快得多(因為 TreeMap 使用紅黑樹進行快速搜索)。

您可以執行以下操作:

Map<String,String> map = new HashMap<String,String>(); 
map.put("x-y-z","test-test1-test2");
map.put("x1-y1-z1","test-test2-test3"); 

String[] rem={"x","x1"};

for (String s : rem) {
    map.keySet().removeIf(key -> key.contains(s));
}

這段代碼將刪除地圖鍵中帶有“x”或“x1”的所有條目。

暫無
暫無

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

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