从Java中删除HashMap中的条目

时间:2014-04-13 22:05:48

标签: java algorithm hashmap hashset

所以我有一个hashmap,其中包含键作为字符串,值为整数,表示我的Set

中出现的字符串的数量

例如,我将有一个hashMap如下

    Key    Value
    abcd    4     (meaning there are 4 duplicate strings of abcd in my Set defined someplace)
    -----   13
    b-b-    7

and so on..

现在我要做的是从HashMap中删除所有空字符串条目。所以在上面的例子中,我想删除所有值为13的空字符串。所以我生成的HashMap将是

Key    Value
abcd    4   
b-b-    7

这是我的代码,试图做同样的事情。 generateFeedbackMap()是一个返回HashMap的函数,StringIterator是我定义的一个类,它迭代遍历字符串的每个字符。

for(String key : generateFeedbackMap().keySet()) {
    StringIterator it = new StringIterator(key);
    int counter = 0;
    while(it.hasNext()){
        String nextChar = it.next();
        if(nextChar.equals("-")){
            counter++;
        }
        Iterator<Map.Entry<String, Integer>> mapIterator = generateFeedbackMap().entrySet().iterator();
        if(counter >= key.length()){

            while(mapIterator.hasNext()){
                Map.Entry<String, Integer> entry = mapIterator.next();
                if(entry.getKey().equals(key)){
                    mapIterator.remove();
                }
            }
        }
    }
}

所以无论在哪里找到“ - ”字符,我都会递增计数器。当计数器等于我的键字符串长度,这意味着它是一个空字符串,我使用Map Iterator删除它,但这不会从我的Map中删除该条目。我做错了什么?

2 个答案:

答案 0 :(得分:1)

generateFeedbackMap()听起来好像是在获取底层地图的副本,在这种情况下,从副本中删除密钥不会影响底层地图。如果您实际上正在获取地图,则应重命名方法。

无论如何,以下内容与原始代码完全相同(但只会从副本中删除)。

Map<String,Integer> feedbackMap = generateFeedbackMap();
for ( String key : feedbackMap.keySet() ) {
    if ( key.matches("-+") ) {
        feedbackMap.remove(key);
    }
}

如果您无法获得基础地图的副本,则需要创建新的helpfulMap。但您仍然可以使用正则表达式和其他Map函数来加快速度:

Map<String,Integer> helpfulMap = new HashMap<>();
for ( Map.Entry<String,Integer> entry : generateFeedbackMap().entrySet() ) {
    if ( ! entry.getKey().matches("-+") ) {
        helpfulMap.put(entry.getKey(),entry.getValue());
    }
}

答案 1 :(得分:0)

好的伙计们,我想我找到了解决方案。我刚刚将所有当前条目从oldMap复制到一个新定义的HashMap,它的键中至少包含一个字母。所以基本上我摆脱了对字符串的所有删除和迭代,而只是使用另一个HashMap,如下所示

    Map<String, Integer> HelpfulMap = new HashMap<String,Integer>();
    for(String key : generateFeedbackMap().keySet())    {             
        StringIterator it = new StringIterator(key);
        while(it.hasNext()){
           String nextChar = it.next();
           if(!nextChar.equals("-")){
              HelpfulMap.put(key, generateFeedbackMap().get(key));
           }
        }
    }

我不知道我之前在做什么。我去洗个好淋浴,想出了这个想法并且有效。我喜欢编程!

感谢大家的投入!