项目遇到了题目所述的问题,还是折腾了一会...

现在总结一下:

这里写一个测试小程序:

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_删除元素的更多相关文章

  1. NYOJ----776删除元素

    删除元素 时间限制:1000 ms  |  内存限制:65535 KB 描述 题意很简单,给一个长度为n的序列,问至少删除序列中多少个数,使得删除后的序列中的最大值<= 2*最小值 输入 多组测 ...

  2. nyoj 776 删除元素

    删除元素 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 题意很简单,给一个长度为n的序列,问至少删除序列中多少个数,使得删除后的序列中的最大值<= 2*最小值 输 ...

  3. 【转】ArrayList循环遍历并删除元素的常见陷阱

    转自:https://my.oschina.net/u/2249714/blog/612753?p=1 在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出b ...

  4. 如何在遍历中使用 iterator/reverse_iterator 删除元素

    如何在遍历中使用 iterator/reverse_iterator 删除元素 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公 ...

  5. javascript删除元素节点

    1.删除元素父节点 function removeElement(_element){ var _parentElement = _element.parentNode; if(_parentElem ...

  6. 遍历List过程中删除元素的正确做法(转)

    遍历List过程中删除元素的正确做法   public class ListRemoveTest {     3 public static void main(String[] args) { 4 ...

  7. 创建删除元素appendChild,removeChild,createElement,insertBefore

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  8. List怎么遍历删除元素

    public static void main(String[] args) {  List<String> list = new ArrayList<String>();   ...

  9. JQUERY添加、删除元素、eq()方法;

    一.jQuery - 添加元素 1.append() - 在被选元素内部的结尾插入指定内容 2.prepend() - 在被选元素内部的开头插入指定内容 3.after() - 在被选元素之后插入内容 ...

随机推荐

  1. NodeJs与ActionScript的GET和POST通讯

    今天项目遇到一个小问题,做了个小功能,向服务端发送GET请求,但是服务端解析数据是时候报语法错误,如下: make Request data error:SyntaxError: Error #113 ...

  2. losbyday Linux查找命令

    PS:第一次发表博客,试一下水,晚一点修改文本格式 linux下的命令都存放在/bin /sbin /usr/bin /usr/sbin路径下等echo $PATH which 是用来查询命令存放的路 ...

  3. 基于Apache搭建Nagios图形监控

    基于apache 的稍微简单一点么?实验一下子就OK了... 环境: System: [root@losnau etc]# cat /etc/issueRed Hat Enterprise Linux ...

  4. SQL复习一(基础知识)

    1.什么是sql SQL(structure query language)是结构化查询语言,它是对关系型数据库的操作语言.它可以应用到所有的数据库中,例如:MySQL.Oracle.SQL serv ...

  5. [Unity UGUI]UGUI提供多种不同的解决方案

    现代游戏和应用程序经常需要支持各种不同的屏幕分辨率,特别是UI布局需要能够适应.UI系统在统一中包括各种工具来实现此目的,可以以多种方式组合在一起. 在这个小节我们将使用一个简单的案例研究和观察和比较 ...

  6. iOS 简易环形进度条

    demo下载地址:https://github.com/haozheMa/LoopProgressDemo/tree/master ViewController中的代码 #import "V ...

  7. NSURL 子串截取

    NSURL *url = [NSURL URLWithString:@"http://reg.email.163.com/unireg/call.do?cmd=register.entran ...

  8. APP导致界面卡死,iPhone卡死

    实测,是 Reachability 类创建实例过多导致 http://stackoverflow.com/questions/34063166/ios-9-app-freeze-with-consol ...

  9. iOS开发——UIAlertController

    iOS8之后,UIAlertView和UIActionSheet被干掉了,取而代之的是UIAlertController和UIAlertAction. UIAlertController有两种样式,一 ...

  10. MongoDB的$type操作符

    字段类型定义: db.col.find({"title" : {$type : 2}})