【问题标题】:Removing from a hashmap a specific value and the key从哈希图中删除特定值和键
【发布时间】:2015-08-13 12:38:09
【问题描述】:

我想从hashmap 中删除一个特定值以及该值中的键。看看,例如,如果我有

hashMap.put(cold, frozen)
hashMap.put(cold,hard)

,在我的图形界面中,我将拥有cold=[frozen,hard]。如果我想删除hard,我想留下cold = [frozen]

我的 hashMap 是private HashMap<String,ArrayList<String>> hashMap ; 这是我尝试过的,但还不够好,因为如果我在 2 个不同的键上有我想要删除的值,它只会删除第一个的值,如果我有前 cold=[frozen,hard] 并且我很难擦除它不会保持cold=[frozen];

for(String key : hashMap.keySet()){
    int siz = hashMap.get(key).size();
    for(int i = 0; i< siz;i++){

        if(hashMap.get(key).get(i).equals(cuvant)){
            s.remove(hashMap.get(key).get(i));
            siz--;
            hashMap.remove(key);

        }
    }
}

我忘了说 s 是带有值的arrayList

【问题讨论】:

  • 小提示:您可以将 Map 声明为 Map&lt;String, List&lt;String&gt;&gt; hashMap - 如果可能,您应该始终针对接口而非实现进行编程。
  • s 中的s.remove(hashMap.get(key).get(i)); 是什么?
  • 对不起,我忘了提。是包含值的数组。
  • 这段代码有很多问题。首先,调用hashMap.put( "cold", "frozen") 甚至都行不通。您已经创建了一个Map,其中的值是List 的实例。尝试添加字符串将失败。即使它确实有效,第二次调用也只会替换地图中的现有值,而不是添加到列表中。接下来,正如另一条评论指出的那样,您有一个未定义的变量 s
  • 我在放置项目时没有任何问题,因为我放置了字符串并且我的哈希映射接收一个键作为字符串和一个字符串数组作为值。我用字符串的含义编辑了我的帖子

标签: java hashmap key


【解决方案1】:

您是否将带有值的 ArrayList 放入哈希图中?

如果是,则先检查列表大小:

if (! hashMap.get(key).isEmpty()){
            hashMap.get(key).remove(ValueToRemoved)
 }

【讨论】:

    【解决方案2】:

    添加条件

    if (hashMap.get(key).isEmpty())
    

    之前

    hashMap.remove(key);
    

    这将确保您仅在与其关联的列表完全为空时删除一个键。


    此外,如果您使用 for-each 循环,请确保在从列表中删除元素后不要继续迭代(内部循环),它会为您提供 ConcurrentModificationException。如果您的列表可以多次具有相同的值(并且应该多次删除),请使用Iterator API 而不是 for-each 循环。

    【讨论】:

    • 这没有回答他的问题。在他的地图中,他有一个包含 N 个值的列表,他想删除其中一个值,以便之后保留一个包含 N-1 个值的列表。
    • @BobbyStJacques 是的,确实如此。您删除一个值(就像原始代码一样),它会从地图中完全删除列表。我回答了如何避免不需要的部分,并使用 N-1 个值保留列表。
    • 是的,我遇到了那个例外。但我不知道 API 迭代器。我去搜一下
    • @BobbyStJacques 它怎么不回答“如果我想用力擦掉我想要冷= [冻结] 留下来”的问题。这正是这个问题的答案......
    • @BobbyStJacques 你确实意识到开头put() 的示例不是真正的代码,只是演示了这个想法。后面的部分确实解释了它是如何实际实现的(每个值都是一个列表的映射),我可以假设实现也相应地进行了调整——因为 OP 在运行时遇到了一个问题,并试图 put(key,element)Map&lt;Key,List&lt;Element&gt;&gt; 中会导致 compile time 错误。
    【解决方案3】:

    试试这个:-

            HashMap<String, ArrayList<String>> m = new HashMap<>();
            Iterator<Map.Entry<String,ArrayList<String>>> iter = m.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry<String,ArrayList<String>> entry = iter.next();
                ArrayList<String> list = entry.getValue();
                for(int i = 0 ; i < list.size() ; i++){
                    if(list.get(i).equals(cuvant)){
                        list.remove(i);
                    }
                }
                if(list.isEmpty())
                    iter.remove();
            }
    

    【讨论】:

    • 如果我看到这个答案,我不会参考它。无论如何,我会更新答案以适合字符串数组列表
    • @vefthym 我认为应该这样做
    • 就是这样。我避免使用 iterator 和 hasNext() 因为我不太熟悉这些术语。非常感谢!
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多