list_删除元素
项目遇到了题目所述的问题,还是折腾了一会...
现在总结一下:
这里写一个测试小程序:
List<Integer> ints = new ArrayList<Integer>();
for (int i =
0; i < 100; i++) {
ints.add(i);
}
我们把里面不能整除3的对象都删除...
首先,最容易想到的,foreach循环,判断删除...
for (Integer integer : ints) {
if (integer % 3 != 0) {
ints.remove(integer);
}
}
运行一下,异常:
java.util.ConcurrentModificationException
这里不详细解释了,最后会给出我参考的那个网页.
简单的说:foreach其实是iterator实现的,而iterator不允许在集合使用自身的时候删除,所以就抛出了前面给的异常.
然后写传统型的for循环吧:
int length = ints.size();
for (int i = 0; i < length; i++) {
if (ints.get(i) % 3 != 0) {
ints.remove(i);
}
}
运行一下,异常:java.lang.IndexOutOfBoundsException
原因是随着元素的删除,List的size发生了变化,但是index没有变化,就会造成index>=size的情况发生,到了后面就越界了...
问题是我习惯于先计算长度再开始循环,因为每次计算size有性能损失...
好吧,只好每次都计算size了:
for (int i = 0; i < ints.size(); i++) {
if (ints.get(i) % 3 != 0)
{
ints.remove(i);
}
}
运行一下,可以跑通,但是结果不正确...
0
2
3
5
6
8
原因是删除之后index对应不上了呵呵...
现在使用奇技淫巧:
for (int i = 0; i < ints.size(); i++) {
if (ints.get(i) % 3 != 0)
{
ints.remove(i);
i--;
}
}
每次满足条件删除一个之后,我们把index减少一个,这样就能保证正常运行了...
但是:但是这绝对不是一个好办法...
其实iterator也提供了remove方法,用这个:
前提是没有其他线程在操作这个list,即若有多个操作者同时操作这个list其结果不见得会对。
Iterator<Integer> iterator = ints.iterator();
while
(iterator.hasNext()) {
Integer temp = iterator.next();
if (temp
% 3 != 0) {
iterator.remove();
}
}
如果你删除的个数是3个,IndexOutOfBoundsException是不会发生的,但是删除后的List不是你想要的结果。具体是
private void unSafeDeleteTopByCount(int count) {
try {
for (int i = 0; i < count; i++) {
list.remove(i);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
print();
}
}
private void print() {
for (String str : list) {
System.out.println(str);
}
}
List<String> list = new ArrayList<String>();
for(int i=0;i<6;i++){
list.add("str"+i);
}
unSafeDeleteTopByCount(3);
打印出的结果是:
str1
str3
str5
为什么呢,当我们删除了index为0的元素【str0】后,由于List的size变化,index为0的元素会变为str1,而index为1的元素会变为str2.
list_删除元素的更多相关文章
- NYOJ----776删除元素
删除元素 时间限制:1000 ms | 内存限制:65535 KB 描述 题意很简单,给一个长度为n的序列,问至少删除序列中多少个数,使得删除后的序列中的最大值<= 2*最小值 输入 多组测 ...
- nyoj 776 删除元素
删除元素 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 题意很简单,给一个长度为n的序列,问至少删除序列中多少个数,使得删除后的序列中的最大值<= 2*最小值 输 ...
- 【转】ArrayList循环遍历并删除元素的常见陷阱
转自:https://my.oschina.net/u/2249714/blog/612753?p=1 在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出b ...
- 如何在遍历中使用 iterator/reverse_iterator 删除元素
如何在遍历中使用 iterator/reverse_iterator 删除元素 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公 ...
- javascript删除元素节点
1.删除元素父节点 function removeElement(_element){ var _parentElement = _element.parentNode; if(_parentElem ...
- 遍历List过程中删除元素的正确做法(转)
遍历List过程中删除元素的正确做法 public class ListRemoveTest { 3 public static void main(String[] args) { 4 ...
- 创建删除元素appendChild,removeChild,createElement,insertBefore
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- List怎么遍历删除元素
public static void main(String[] args) { List<String> list = new ArrayList<String>(); ...
- JQUERY添加、删除元素、eq()方法;
一.jQuery - 添加元素 1.append() - 在被选元素内部的结尾插入指定内容 2.prepend() - 在被选元素内部的开头插入指定内容 3.after() - 在被选元素之后插入内容 ...
随机推荐
- 现在都是python 单独开发框架 执行脚本,处理结果,发报告之类的
现在都是python 单独开发框架 执行脚本,处理结果,发报告之类的
- (译)Windsor入门教程---第一部分 获取Windsor
原文:http://docs.castleproject.org/Windsor.Windsor-tutorial-ASP-NET-MVC-3-application-To-be-Seen.ashx ...
- 控制流之break
break语句是用来 终止 循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,也停止执行循环语句.一个重要的注释是,如果你从for或while循环中 终止 ,任何对应的循环else块 ...
- Lumen 配置、重写、404错误等
1.权限是否有设置为777: 2.app key是否有设置: 3.apache下是否有开启重写,a2enmod: 4.nginx下server的location是否配置正确,重写规则有没添加,rout ...
- Zbus 笔记
http://blog.csdn.net/cx308679291/article/details/50113257 Zbus学习笔记 标签: zbus 2015-11-30 15:55 266人阅读 ...
- linux动态链接库---一篇讲尽
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.s ...
- Android L(5.0)源码之图形与图像处理之动画——Frame、Tween、属性动画、SurfaceView
工作中暂时还没涉及到,暂时先不总结
- 网络请求工具--AFNetworking 分类: ios技术 2015-02-03 08:17 76人阅读 评论(0) 收藏
在我们开发过程中,网络请求是必不可少的,对于网络框架,现在主流的大概只有三类:ASI框架: HTTP终结者(已经停止更新了),MKNetworkKit ,AFN.今天我就来浅谈一下这个AFN AFNe ...
- mysql 省市联动sql 语句
/*MySQL Data TransferSource Host: localhostSource Database: virgoTarget Host: localhostTarget Databa ...
- react programming
So you're curious in learning this new thing called Reactive Programming, particularly its variant c ...