【问题标题】:removing entries from a HashMap in Java从 Java 中的 HashMap 中删除条目
【发布时间】:2014-04-13 22:05:47
【问题描述】:

所以我有一个哈希图,其中包含作为字符串的键和作为在我的集合中出现的那些字符串的计数的整数

例如,我将有一个如下的 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 中删除该条目。我做错了什么?

【问题讨论】:

  • 为什么会有这些“-”字符?为什么不在将它们放入哈希图中之前忽略它们?
  • 其实这是我正在制作的刽子手游戏的一部分。我需要初始正常模式之一的空字符串,但我目前正在研究另一种模式,我想从 HashMap 中删除所有空字符串
  • 您是否有 1 个条目带有一堆 ---- 或者您有多个带有 --s 的条目?您想删除任何只有 -? 的条目
  • 我有多个条目。例如,我将有 10 个 --s 条目,或者我将有 56 个 k--o 条目,或者我将有 79 个没有任何字母的字符串条目,例如 -----,我正在尝试删除所有 79 个条目这些字符串中没有任何字母
  • 为什么不只是if ( key.matches("^-+$") )

标签: java algorithm hashmap hashset


【解决方案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());
    }
}

【讨论】:

    【解决方案2】:

    好的,伙计们,我想我找到了解决方案。我刚刚将所有当前条目从 oldMap 复制到一个新定义的 HashMap 中,该 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));
               }
            }
        }
    

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

    感谢大家的投入!

    【讨论】:

    • 这似乎有些低效:1. 多次调用generateFeedbackMap(),2. 如果键有多个非破折号,则多次调用puts,3. 创建新地图而不是从旧地图中删除地图。但如果它完成了工作......
    • 是的,它看起来像,但如果你能帮助我提供比我更好的解决方案,我将不胜感激!
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多