技术标签: java
在日常代码中,遍历List然后删除特定的元素是很常见的操作,Java中的循环主要有普通的for循环、增加for循环、iterator遍历这几种方法,我们知道在循环list时删除元素可能引起异常,这里总结下什么情况下会引起异常,什么情况不会引起异常。
1. for循环正序遍历list
for(int i=0;i<list.size();i++){
if(list.get(i).equals("del"))
list.remove(i);
}
这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。
2. for循环倒序遍历list
for(int i=list.size()-1;i>=0;i++){
if(list.get(i).equals("del"))
list.remove(i);
}
由于正序遍历有以上的问题,这里可以采用倒序遍历的方法。因为在倒序遍历时,即使删除了某index元素,List中 0~index-1之间的元素并未变化,下次循环时获取的index-1的元素也是正确的,因此此种方法不会有问题。
3.增强for循环
for(String x:list){
if(x.equals("del"))
list.remove(x);
}
这种方式的问题在于,删除元素后继续循环会报错误信息ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出。但是删除完毕马上使用break跳出,则不会触发报错。
4.iterator遍历
Iterator<String> it = list.iterator();
while(it.hasNext()){
String x = it.next();
if(x.equals("del")){
it.remove();
}
}
这种方式可以正常的循环及删除。但要注意的是,使用iterator的remove方法,如果用list的remove方法同样会报上面提到的ConcurrentModificationException错误。
5. 先记录元素,后续执行删除。
以上都是在循环中删除某个元素的操作,在实际代码中如果怕出现问题,可以创建另外的一个List在遍历过程中记录需要删除的元素,然后根据这个List从原List删掉对应元素即可:
ArrayList<String> toRemoveList = new ArrayList<String>();
for (String str: list) {
if (str.equals("del")) {
toRemoveList.add(str);
}
}
for (String removeStr : toRemoveList) {
list.remove(removeStr);
}
这样能保证不出问题,只是在执行效率上稍微低下,在对性能要求不高的情况下可以这样处理。
总结:
(1)循环删除list中特定一个元素的,可以使用三种方式中的任意一种,但在使用中要注意上面分析的各个问题。
(2)循环删除list中多个元素的,应该使用迭代器iterator方式 或 倒序遍历的方式。
( 3 ) 先记录后删除的方式不会出问题,但是影响性能,视具体情况使用。
文章浏览阅读4.4k次。 添加,删除,查找之后希望 Grid定位到需要的行 Me.dgvPaper.Rows(i).Selected = True 设置能保证选中行,一旦找到了就定位到相应的位置,如果数据行很多的话,希望滚动条滚到相应的位置。 DataGridView控件有一个FirstDisplayedScrollingRowIndex属性,把需要定位的行index(N)赋值给这个属性之后,DataGridV_datagridview定位行不准
文章浏览阅读127次。为什么80%的码农都做不了架构师?>>> ...
文章浏览阅读3.6k次。还有一种热点数据的发现机制,那就是实时的做收集,比如在客户端、服务端或者在代理层,都可以对实时数据进行采集,然后进行统计汇总。达到一定的数量之后,就会被识别为热key如何解决热key问题解决热key问题最主要的方式就是加缓存。通过缓存的方式尽量减少系统交互,使得用户请求可以提前返回。这样即能提升用户体验,也能减少系统压力。缓存的方式有很多,有些数据可以缓存在客户的客户端浏览器中,有些数据可以缓存在距离用户就近的DNS中,有些数据可以通过Redis等这类缓存框架进行缓存,还有些数据可以通过服务器本地_jd-hotkey
文章浏览阅读2k次。SAE J1708协议1.协议简介1708是SAE(Society of Automotive Engineers:美国机动车工程师学会)专门针对重型车辆(卡车和客车)起草文件中J标准规范之一,该协议旨在推广微控制器模块之间的通信标准规范。SAE J1708协议仅详细描述了OSI(Open System Interconnection:开放式系统互联)七层模型中的物理层和数据链路层。所以在进行通信时,常常需要与描述应用层的SAE J1587协议一起使用。图1-OSI模型 ..._j1708协议
文章浏览阅读7.2k次,点赞8次,收藏53次。上一篇介绍了CNN基本概念和卷积的知识,CNN的特征抽取除了包含卷积,还包含池化。池化池化又叫子采样,是特殊的卷积。池化比较好理解,还是上篇公司工作交接的例子,每个销售区域有100个老员工,我们可以先推举一个最懂本区域的业务人员参与交接(如各区域的领导),其他人员不必参与交接;或者每个区域内部先开一个会,把100个老员工的经验结合在一起,生成一个会议纪要,根据这份纪要与新员工交接。这实际对应两种池...
文章浏览阅读92次。java很火,日志记录又是必需,因此就有了大量的日志记录框架,在日常使用时因为日志框架冲突引发各种问题,本文对之进行梳理,适合入门。由于作者水平限制,本文可能不够清晰甚至有错,烦请指出。在文章末尾的参考部分,有几位大牛总结的文章,推荐给大家。下文将着重介绍上述日志框架的区别,以及避免不同框架组合引入时的冲突。两个概念日志系统日志接口的具体实现。经典的有log4j,jdk自带的有java.u...
文章浏览阅读392次,点赞2次,收藏2次。L1-039 古风排版 (20分)中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。输入格式:输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。输出格式:按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。输入样例:4This is a test case..._ptal1-039
文章浏览阅读822次,点赞5次,收藏3次。1 前言 当你踏入面试房间的第一只脚开始,你的一举一动就都在面试官眼里和心里了,从最开始的自我介绍,到最后结束面试时的提问,都不能草率对待。下面,我根据技术面的几种常见面试形式,分别介绍一些特有的技巧,并且会在此基础上再额外介绍一些通用技巧,来帮助你拿下面试。 2 一对一面试 技术面最常见的形式就是一对一的面试,一般的流程是这样的:你带着简历走进去,将简历送给面试官,面试官在浏览你简历的时候会要求你自我介绍。2、3分钟的自我介绍结束后就正式进入了面试环节,面试官会根据对你简历的理解程度询_开发技术面技巧
文章浏览阅读4.5k次。参数详解属性 说明 value 当前值 默认 0 -- 1 之间 onChanged 滑动监听 onChangeStart 滑动前监听 onChangeEnd 滑动后监听 min 最小值 默认 0 max 最大值 默认 1 divisions 分段个数 label 滑动时 显示的文字 (不设置divi...
文章浏览阅读403次。为什么80%的码农都做不了架构师?>>> ..._为什么会报错command line is too long
文章浏览阅读1.3k次。历届试题 买不到的数目 时间限制:1.0s 内存限制:256.0MB问题描述小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。本题的要求就是在已知两_最大不能买到的数量是17
文章浏览阅读1.1k次。支付宝:https://open.alipay.com/platform/home.htm微信:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F银联:https://open.unionpay.com/ajweb/help/qrcodeFormPage各大银行:http://openhome.cmbchina..._alipay.trade.precreate