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

现在总结一下:

这里写一个测试小程序:

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. Codeforces AIM Tech Round3

    打得最烂一场Codeforces,多次都错题,无限WA... A题: 题意:给定n个橘子的大小,大小超过b的丢掉,不足d的补充进来,同时超过d的部分去掉,问要去掉几次 分析:直接模拟即可 #inclu ...

  2. PHP的几种排序算法的比较

    这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助 /* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 85 ...

  3. Handler和Message以及Looper之间的三角关系

    说到Handler想必大家都经常用到,在非UI线程更新UI那可是利器,用起来也非常容易上手 从使用上来说,我们只需要关注sendMessage和handleMessage即可 所以我们先从Handle ...

  4. vs2012中的小技巧

    解除起始页: 网站(或者叫项目)-属性-启动选项-使用当前页 发布项目: 有些文件在发布的时候,不能发布到指定文件夹中,所以要手动修改该文件的属性 修改两处: 复制到输出目录:始终复制 生成操作:内容

  5. SPOJ839 OPTM - Optimal Marks

    传送门 闵神讲网络流应用的例题,来水一水 要写出这道题,需要深入理解两个概念,异或和最小割. 异或具有相对独立性,所以我们把每一位拆开来看,即做大概$32$次最小割.然后累加即可. 然后是最小割把一张 ...

  6. 【转】国外程序员整理的 C++ 资源大全

    内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++标准库,包括了STL容器,算法和函数等. C++ Standard Library:是一系列类 ...

  7. Windows录音API学习笔记(转)

    源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...

  8. Matlab笔记

    提取RGB分量,并显示出来 rgb=imread('mao.jpg'); rgb_r=rgb(:,:,); rgb_g=rgb(:,:,); rgb_b=rgb(:,:,); zero=zeros(, ...

  9. Python3基础 frozenset() 创建一个不可更改的集合

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  10. OC--设置视图控制器,从导航栏的下边缘开始

    self.edgesForExtendedLayout = UIRectEdgeNone;