您当前的位置: 首页 >  Java

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java和c++ 删除hash表的内容

qianbo_insist 发布时间:2021-07-02 06:16:55 ,浏览量:0

java删除HashMap 方式一 错误

以下这段方式是错误的方式,产生ConcurrentModificationException,在hashmap本身在循环过程中删除节点不正确。

  public void removeBymap_iswrong(){
        HashMap map = new HashMap();  
        map.put(1, "one");  
        map.put(2, "two");  
        map.put(3, "three");  
        System.out.println(map);  
        Set entries = map.entrySet();  
        for(Map.Entry entry : entries){  
            if(entry.getKey() == 2){  
                map.remove(entry.getKey());  
            }  
        }  
        System.out.println(map);  
    }  
正确的删除方式

java必须使用本身迭代器的remove方法来删除节点。

import java.util.HashMap;  
import java.util.Iterator;  
import java.util.Map;  
import java.util.Set;  
  
 
public class HashMapOperate {  
    public static void main(String[] args){  
        new HashMapOperate ().removeByIterator();  
//        new TestMapRemove().removeBymap_iswrong();  
    }  
    //it is right
    public void removeByIterator(){
        HashMap map = new HashMap();  
        map.put(1, "one");  
        map.put(2, "two");  
        map.put(3, "three");  
        System.out.println(map);  
        Iterator it = map.entrySet().iterator();  
        while(it.hasNext()){  
            Map.Entry entry = it.next();  
            if(entry.getKey() == 2)  
                it.remove();
        }  
        System.out.println(map);  
    }  

  
}  
c++ 删除map 或者unordered_map内容

以下错误,迭代器在元素被删除后失效,for语句中与mapData.end() 无法进行比较

int main(int argc, char* argv[])  
{  
    map mapData = {{"1","aaa"},{"2","bbb"},{"3","ccc"}};  
      
    for (auto iter=mapData.begin(); iter!=mapData.end(); iter++)  
    {  
        if (i->first == "2")  
        {  
            mapData.erase(iter);  
        }  
    }  
    return 0;  
}  

正确的删除:

int main(int argc, char* argv[])  
{  
    map mapData = {{"1","aaa"},{"2","bbb"},{"3","ccc"}};  
      
    for (auto iter=mapData.begin(); iter!=mapData.end();)  
    {  
        if (i->first == "2")  
        {  
            mapData.erase(iter++);  
        }  
        else
           iter++;
    }  
    return 0;  
}  

从源码上分析其实是做到的这样的操作:

map::iterator itertemp = iter;
++iter;
mapData.erase(itertemp);

也就是复制一份迭代器,迭代器+1,删除前面复制的迭代器内容,自然就没有什么问题了。

关注
打赏
1663161521
查看更多评论
立即登录/注册

微信扫码登录

0.0369s