java中map删除指定元素_Map中根据条件删除元素
今天在写程序过程中,需要根据判断条件删除一个Map中的相应数据,我自然而然想到可以通过调用Map中的remove(Object key)函数进行删除:代码如下:
public Map processMap(Map list) {
Map map = list;
Iterator iter = map.keyset().iterator;
while(iter.hasNext()) {
double key = iter.next();
if (key > 5)
map.remove(key);
}
return map;
}
但是运行程序的时候却没有正常删除元素,而是提示“Java.util.ConcurrentModificationException”错误,很是疑惑,于
是找了一些关于Map的资料发现:Map的实现不是同步的。如果程序中出现多个线程同时访问一个Map,而其中至少一个线程修改Map
时,它必须保持外部同步。而通过查看Iterator原理发现,Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说
Iterator在工作的时候,是不允许被迭代的对象被改变的,所以调用Iterator操作获得的对象在多线程修改Map的时候会自动失效。
Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索
引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。Map、List、Set等是动态
的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始
数据发生变化时,Iterator自己就迷失了方向。
既然找到了问题的原因,那么如何解决呢?可以通过调用Iterator的remove(Object o)函数来移除元素。
测试代码如下:
public Map processMap(Map list) {
Map map = list;
Iterator iter = map.keyset().iterator;
while(iter.hasNext()) {
double key = iter.next();
if (key > 5) {
// map.remove(key); // java.util.ConcurrentModificationException
iter.remove(key); // OK
}
}
return map;
}
同时,在遍历Map过程中,调用put(key, value)函数来添加元素,也会出现同样的问题,所以同样需要使用迭代器的相应函数来添加。
【Matlab开发】matlab删除数组中符合条件的元素与散点图绘制
[Matlab开发]matlab删除数组中符合条件的元素与散点图绘制 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ matlab删除数组中符合条件的元素 如 ...
JavaScript向select下拉框中加入和删除元素
JavaScript向select下拉框中加入和删除元素 1.说明 a 利用append()方法向下拉框中加入元素 b 利用remove()方法移除下拉框中最后一个元素 2.设计源代码 < ...
JavaScript向select下拉框中添加和删除元素
JavaScript向select下拉框中添加和删除元素 1.说明 a 利用append()方法向下拉框中添加元素 b 利用remove()方法移除下拉框中最后一个元素 2.设计源码 < ...
Lambda 表达式遍历集合时用remove方法删除list集合中满足条件的元素问题
一:循环遍历list集合的四种方式 简单for循环 iterator循环 增加for循环 Lanbda表达式 二:四种遍历方式的用法示例 //简单for循环 List
STL 中 使用迭代器删除元素的问题
在vector中删除,大家都知道,直接erase的话,这种写法很有问题.因为erase(iter)之后iter指针就变成野指针了,此时继续iter++就会出问题. for(auto iter = v. ...
Java中ArrayList的删除元素总结
Java中循环遍历元素,一般有for循环遍历,foreach循环遍历,iterator遍历. 先定义一个List对象 List list = new ArrayList&l ...
从LIst集合中安全的删除元素
package cn.rocker.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List ...
go语言学习--map中键值得删除
测试 map1 中是否存在 key1: 在例子 8.1 中,我们已经见过可以使用 val1 = map1[key1] 的方法获取 key1 对应的值 val1.如果 map 中不存在 key1,val ...
判定map中是否存在某元素
判断某key是否存在可以使用map的count方法来间接判定 count接受一个参数key值,返回map中key值为给定值的元素总数 map i_to_s_map ...
随机推荐
转换一个矩阵(2维数组)为HTML Table
matrix[row][col],比如[ [ "Name", "Age" ], [ "Sam", 12 ] ] function (m) { ...
推荐一款非常棒的谷歌插件---快速查看HTML页面元素的CSS样式
一.下载地址 http://chromecj.com/web-development/2015-05/456/download.html 二.简介 CssViewer是一款快速查看当前页面元素的CSS ...
枚举esum20160530
关于枚举 常见定义形式,类似定义结构体,先定义枚举变量类型: typedef enum{ Bit_RESET = 0, Bit_SET}BitAction; enum box{pencil,pen ...
ios之点语法
第一个object c 程序 首先新建一个项目,“create a new Xcode project"-"OS X下的Application"-"Comman ...
利用VSTS跟Kubernetes进行CI/CD
准备VSTS管理环境 首先我们需要到www.visualstudio.com下申请好的VSTS账号,然后在账号下创建一个用Git作为代码管理的项目 创建好项目后我们就可以利用git clone将代码库 ...
python中的双向链表实现
引子 双向链表比之单向链表,多数操作方法的实现都没有什么不同,如is_empty, __len__, traverse, search.这些方法都没有涉及节点的变动,也就可通过继承单向链表来实现即可. ...
Shell 数组定义与获取
Shell 数组 bash支持一维数组(不支持多维数组),并且没有限定数组的大小. 类似与 C 语言,数组元素的下标由 0 开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于 ...
2.网络编程-udp
# 使用套接字发送udp数据import socket s = socket.socket(socket.AF_INET, SOCK_DGRAM) s.sendto(b"hello" ...
twisted 学习笔记一:事件循环
from twisted.internet import reactor import time def printTime(): print "Current time is", ...
java中map删除指定元素_Map中根据条件删除元素相关推荐
- linux随机删除指定文件夹中的部分数据
linux中可以使用以下指令随机删除指定文件夹中的一定数量的数据: shred -n <次数> -u <文件或目录> -z -s <大小> 其中,-n表示覆盖的次数 ...
- java中map如何实现遍历_Java中如何遍历Map对象的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- java中map的遍历方法_Java中Map的三种遍历方式
集合中的三种遍历方式,如下代码: import java.util.Collection; import java.util.HashMap; import java.util.Iterator; i ...
- python删除指定行_关于csv:删除python中的特定行和对应文件
我想删除90%的"转向"值等于0的行.这三个图像都有一个对应的图像文件,中间,左边和右边.我也要删除它们.csv文件如下: 我编写了以下代码,以至少获取转向值为0的文件.我所需要的 ...
- java中map怎么取值_java中map的取值
package com.itcast.map; import java.util.HashMap; import java.util.Map; import java.util.Set; import ...
- php 中 map和array,浅析php中array_map和array_walk的使用对比
一.array_map() 1.array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,若函数作用后无返回值,则对应的新值数组中为空. 2.回调 ...
- python中map的返回值_python中map函数是什么?怎么用?
下面给大家介绍关于map函数的使用,给大家分为几大实用类型模块,具体内容请看下文哦~ map()函数简介 Python 的map()方法,作为输入提供的迭代器的所有元素应用函数. 例如,迭代器可以是列 ...
- html中map标签的用法,HTML中的map和area标签
1. 标签介绍: (1)map标签: 该标签是指图片的映射,也就是说一张可以点击的图片的映射: 属性介绍: <1> id: 中的 usemap 属性可引用 中的 id 或 name 属性( ...
- 表的插入、更新、删除、合并操作_17_按照条件删除表中记录
按照条件删除表中记录 需求描述 需求:删除dept表里deptno为50的记录,但后期可通过数据库日志恢复. 解决方法:这里通过DELETE FROM TableName WHERE Columnam ...
最新文章
- 制造工业中的机器学习应用:I概览
- 【转】shell pipe与输入输出重定向的区别
- cgroups(7)— Linux中文手册页
- html源码蔡,html基础代码详解
- 如何在linux下运行php脚本,如何通过Linux命令行使用和运行PHP脚本
- MySQL数据表类型及文件结构
- php实现新闻管理系统,PHP基础示范:用PHP+Mysql编写简易新闻管理系统_mysql
- 花瓣网服务器维护一个月,花瓣网维护网站推荐-只需要这一个网站就够了
- 华为云obs对象存储使用教程
- 数字图像处理第三章-----空间域滤波
- SQL Server超详细使用教程——从安装到编写SQL语句
- 树莓派CM4基于emmc安装Ubuntu系统及初始配置
- MTK 驱动(61)---MT6737 Android N 平台 ----ALSA Driver
- uni-app 对照设计稿还原不同屏幕像素适配(iPhone X)
- adb连接雷电模拟器失败
- Android笔记:将布局转换成图片
- 阿里X82Y的解决方案及接口
- 调试工具-DEBUG
- 为期两个月的MATLAB与ROS联合仿真探索总结——因为热爱,所以无所畏惧
- 2021年金属非金属矿井通风免费试题及金属非金属矿井通风考试总结