关于算法:从Java中删除HashMap中的条目

removing entries from a HashMap in Java

所以我有一个hashmap,它包含键作为字符串,值作为在我的集合中发生的那些字符串的计数的整数。

例如,我会有一个如下的哈希图

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

and so on..

现在我要做的是从哈希图中删除所有空字符串条目。所以在上面的例子中,我想删除所有值为13的空字符串。所以我得到的哈希图是

1
2
3
Key    Value
abcd    4  
b-b-    7

这是我的代码,它试图做同样的事情。generatefeedbackmap()是一个函数,它返回考虑到的哈希映射StringIterator是一个类,我定义了该类,它遍历字符串的每个字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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迭代器删除它,但这不会从我的映射中删除条目。我做错什么了?


generateFeedbackMap()使它听起来像是您得到了底层映射的副本,在这种情况下,从副本中删除一个键不会影响底层映射。如果你真的得到了地图,那么你应该重新命名你的方法。

无论如何,下面的代码将完成与原始代码相同的工作(但只会从副本中删除)。

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

如果您一直无法获得底层映射的副本,那么您需要创建新的helpfulMap。但是您仍然可以使用正则表达式和其他Map函数来加快速度:

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

好吧,伙计们,我想我找到了解决办法。我刚刚将所有当前条目从oldmap复制到一个新定义的hashmap中,该hashmap在键中至少包含一个字母。所以本质上,我去掉了所有对字符串的删除和迭代,只使用另一个hashmap,如下所示

1
2
3
4
5
6
7
8
9
10
    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));
           }
        }
    }

我不知道我以前在做什么。我洗了个澡,想出了这个主意,效果很好。我喜欢编程!

感谢大家的投入!