从hashmap对象中删除值的有效方法

时间:2011-01-15 17:00:15

标签: java hashmap

我有一个HashMap对象包含一个键x-y-z,其值为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值。

任何人都可以提供有效的方法来执行此操作吗?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

根据已修改的问题进行编辑。

循环遍历hashmap的keySet。当您找到以x开头的键时,您正在寻找将其从地图中删除。

类似的东西:

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

答案 2 :(得分:0)

假设我理解正确,你想从地图中删除以'x-'和'x1-'开头的所有内容(但不是'x1111-',即使'x1'是'x1111'的前缀) ,效率很重要,您可能希望查看NavigableMap的其中一个实现,例如(例如)TreeMap

NavigableMaps按顺序保存其条目(默认情况下按自然键顺序),并且可以非常有效地迭代和搜索。

它们还提供类似subMap的方法,它们可以生成另一个包含指定范围内的键的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()应该比迭代每个地图条目快得多(因为TreeMap使用red-black tree进行快速搜索)。

答案 3 :(得分:0)

您可以执行以下操作:

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”的所有条目。

相关问题