`
hjj20040849
  • 浏览: 113889 次
  • 来自: 广州
社区版块
存档分类
最新评论

使用for循环删除集合元素需要注意的问题

    博客分类:
  • java
阅读更多

for语句在程序开发中经常被用到,他语法简单逻辑严谨,在一定的情况下可以节省很多用while和dowhile代码量,所以他的应用范围是很广泛的,但是,在应用的时候,如果语句中的自增或者自减变量i若处理不当,就可能给程序带来巨大隐患。例如在用for语句删除集合中的元素时,就可能出现以下的情况。

下面先给个例子大家看一下先。

 

public class e {
	public static void main(String[] args) {
		List<String> tempList = new LinkedList<String>();
		tempList.add("A");
		tempList.add("B");
		tempList.add("C");
		
		for(int i = 0; i < tempList.size(); i++){
			tempList.remove(i);
		}
		
		if(tempList.size() > 0){
			System.out.println("剩余的个数为:" + tempList.size() + ",具体的元素为:");
			
			for(String t : tempList){
				System.out.println(t);
			}
		} else{
			System.out.println("所有的元素已经删除完毕");
		}
	}
}

 

  不知道大家看到问题了没有,或许很多朋友会说,没问题啊。。好吧,下面我们看一下程序的运行结果。


 

结果竟然出乎我们的意料,竟然还有个B,对吧,为什么呢? 下面就让我们来一起探讨一下吧。

说道这里,首先我们就要先了解一下集合元素删除的内部变化吧,就这个案例来说,



如图,我们分析得到,每当删除一个元素时,集合的size方法的值都会减小1,这将直接导致集合中元素的索引重新排序,进一步说,就是剩余所有元素的索引值都减1,正如上图所示,而for循环语句的局部变量i仍然在递增,这将导致删除操作发生跳跃。从而导致上述B么还有删除的问题。。

下面我们再更改一下程序。

import java.util.LinkedList;
import java.util.List;

public class test {
	public static void main(String[] args) {
		List<String> tempList = new LinkedList<String>();
		tempList.add("A");
		tempList.add("B");
		tempList.add("C");
		
		
		for(int i = 0; i < tempList.size(); i++){
			tempList.remove(i);
			i--;
		}
		
		if(tempList.size() > 0){
			System.out.println("剩余的个数为:" + tempList.size() + ",具体的元素为:");
			
			for(String t : tempList){
				System.out.println(t);
			}
		} else{
			System.out.println("所有的元素已经删除完毕");
		}
	}
}

 
看一下下面的结果, 正确了吧,呵呵。

 


 

 写下这个的原因是希望大家也注意这些类似的情况,不一定是删除集合时才需要注意。细节不仅能够打败爱情,还能够打败成功,所以要小心哦。。

 

  • 大小: 7.7 KB
  • 大小: 3.8 KB
  • 大小: 4.2 KB
分享到:
评论

相关推荐

    C#在foreach遍历删除集合中元素的三种实现方法

    在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...

    40道java集合面试题含答案(很全很详细)

    Collection接口继承自Iterable接口,这意味着可以通过for-each循环遍历集合元素。 List接口是有序的集合,可以包含重复的元素。List接口提供了按照索引位置访问元素的方法,以及添加、删除和修改元素的操作。List...

    Python list列表中删除多个重复元素操作示例

    本文实例讲述了Python list列表中删除多个重复元素操作。...如果采用for循环遍历各元素: for x in l: if x == 6: l.remove(x) 结果为[9, 5, 7, 8, 9, 6, 0],后面的6没有删除。主要因为remove改变了list长度和每

    SpringBoot_Freemarker生成Word_多个表格+两层嵌套循环

    PLUS:若表格之外还有嵌套的循环,也需要用&lt;#list table as map&gt;&lt;/#list&gt;,注意这里的&lt;#list&gt;&lt;/#list&gt;标签不要和某对其他标签交叉,不可以出现&lt;#list&gt;&lt;w:p&gt;&lt;/#list&gt;&lt;/w:p&gt;这种 6. 标识替换完之后,另存为.ftl后缀...

    Python程序基础:列表和元组.pptx

    2.使用for循环遍历列表;;2.查找元素与计数;3??删除元素;4.列表排序;元组(tuple):与列表类似,不同之处在于不能修改元组的元素,元组使用圆括号包含元素,而列表使用方括号包含元素。;1.访问元组;2.合并元组;...

    Access+2000中文版高级编程

    2.5.3 对集合元素循环 43 2.6 定制窗体 44 2.6.1 编写定制的属性 45 2.6.2 编写值为对象的属性 48 2.6.3 编写定制的方法 48 2.7 编写类模块 49 2.7.1 创建外界支持的对象 49 2.7.2 创建类模块 50 ...

    Access 2000中文版高级编程(part1)

    2.5.3 对集合元素循环 43 2.6 定制窗体 44 2.6.1 编写定制的属性 45 2.6.2 编写值为对象的属性 48 2.6.3 编写定制的方法 48 2.7 编写类模块 49 2.7.1 创建外界支持的对象 49 2.7.2 创建类模块 50 2.7.3 使用...

    JavaScript中的集合及效率

    数组是JavaScript提供的一个内部对象,它是一个标准的集合,我们可以添加(push)、删除(shift)里面元素,我们还可以通过for循环遍历里面的元素,那么除了数组我们在JavaScript里还可以有别的集合吗? 由于JavaScript...

    python学习笔记——集合与字典

    集合元素不可重复,集合类型只能是固定的数据类型。 python编译器中界定固定数据类型与否主要考察类型能否进行哈希运算。python中提供了一种同名的具体数据类型——集合(set) 由于集合是无序组合,他没有索引和...

    C# 3.0完全自学宝典 (F)

    UseWhile 演示while、loop、for循环语句使用 第3章(\ch03) 示例描述:学习C#面向对象开发实例。 AnimalPerson 演示C#类的使用 Anonymous 演示匿名类的使用 ClsIndexeer 演示类索引器的使用 ExtMethod 演示...

    少儿编程Python电子学会二级课件

    本套PPT根据全国青少年软件编程等级考试标准(Python)语言二级标准相关的知识大纲编写。介绍列表、元组、字符串、字典和集合,程序控制(分支结构、循环结构)的相关知识。每课时均有相关的练习题。...理解for循环、

    2020年9月Python青少年软件编程二级真题

    二级标准 一、 了解与掌握如下的python编程的进阶知识,并会使用。 1. 知道如下几种数据类型:列表、元组、字典...理解for循环、while循环、break和continue循环控制 结构语句; 4. 理解range类型的概念,掌握它的基础

    《C#经典编程220例》.(明日科技).【带书签】-共3部分

    实例009 利用for循环输出多行语句 13 实例010 输入并输出姓名 14 实例011 使用值类型和引用类型输出不同的字段 15 实例012 判断当前系统日期是星期几 17 实例013 定义局部变量输出不同的字段 19 实例014 定义循环...

    明日科技C#开发入门及项目实战

    实例009 利用for循环输出多行语句 实例010 输入并输出姓名 实例011 使用值类型和引用类型输出不同的字段 实例012 判断当前系统日期是星期几 实例013 定义局部变量输出不同的字段 实例014 定义循环内部变量并输出变量...

    vue语法.rar

    3.let与for循环 十一、const的用法 const声明一个常量,一旦声明后就不能修改了 1.如果声明后再去修改的话就会报错 2.只声明不赋值也会报错 3.只能先声明后使用,不会被提前解析 4.不能重复声明一个常量 ...

    C# for CSDN 乱七八糟的看不懂

    使用集合时,必须注意集合的生命期问题。如果有两个集合 L1 和 L2,使用 了 L1=L2; 后,只要 L2 生命期没有终结,它的以后的变化就可能会影响到 L1 的数值。因 此在赋值后应该及时销毁或者初始化 L2,以免发生不可...

Global site tag (gtag.js) - Google Analytics