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() - 在被选元素之后插入内容 ...
随机推荐
- Unity3d之协程自实现测试
using UnityEngine; using System.Collections; public class TestStartCoroutine : MonoBehaviour { IEnum ...
- POJ 2395 Out of Hay
这个问题等价于求最小生成树中权值最大的边. #include<cstdio> #include<cstring> #include<cmath> #include& ...
- jQuery修改css属性
jQuery CSS 操作jQuery 拥有三种用于 CSS 操作的重要函数:$(selector).css(name,value)$(selector).css({properties})$(sel ...
- DS5 调试 android c++
1.修改Application.mk APP_STL := gnustl_static #这里用gnustl #NDK_TOOLCHAIN_VERSION=clang #这里注释掉 APP_CPPFL ...
- Java Spring MVC项目搭建(一)——Spring MVC框架集成
1.Java JDK及Tomcat安装 我这里安装的是JDK 1.8 及 Tomcat 8,安装步骤详见:http://www.cnblogs.com/eczhou/p/6285248.html 2. ...
- UVa 11456 - Trainsorting
题目大意:给一个车辆到达车站的序列(按时间先后),可以对车辆进行以下处理:插在队首.插在队尾或者拒绝进站.车站内的车辆必须按照重量大小从大到小排列,问车站内最多能有多少辆车辆? 假设车i是第一个进站, ...
- 轻轻的扩展了一下IEnumerable<T>
今天用EF写东西玩,觉得IEnumerable里面除了where().select(),是不是能添加点其他方法呢. 想做就做,F12到方法定义: public static IEnumerable&l ...
- 2016——3——16 kmp 7题
1.传送门:http://begin.lydsy.com/JudgeOnline/problem.php?id=2725 题目大意:找一个串在另一个串中出现的次数 题解:kmp(纯裸题) #inclu ...
- Redis 排行榜 自己简单练习
<?php class Ranks{ const PREFIX = 'zhengban'; protected $redis = ''; /* 初始化 */ public function __ ...
- QGis(三)查询矢量图层的要素属性字段值(转载)
QGis(三)查询矢量图层的要素属性字段值 https://github.com/gwaldron/osgearth/issues/489 当加载一个矢量图层后,如果要查看要素的属性字段值,则需要实现 ...