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,删除前面复制的迭代器内容,自然就没有什么问题了。