how2j.cn

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



4分43秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



关键字 简介 示例代码
for
用for循环遍历
示例代码
iterator
迭代器遍历
示例代码
for:
用增强型for循环
示例代码
练习-删除ArrayList中的数据
示例代码
答案-删除ArrayList中的数据
示例代码
步骤 1 : 用for循环遍历   
步骤 2 : 迭代器遍历   
步骤 3 : 用增强型for循环   
步骤 4 : 练习-删除ArrayList中的数据   
步骤 5 : 答案-删除ArrayList中的数据   

步骤 1 :

用for循环遍历

通过前面的学习,知道了可以用size()和get()分别得到大小,和获取指定位置的元素,结合for循环就可以遍历出ArrayList的内容
用for循环遍历
package collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> heros = new ArrayList<Hero>(); // 放5个Hero进入容器 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero name " + i)); } // 第一种遍历 for循环 System.out.println("--------for 循环-------"); for (int i = 0; i < heros.size(); i++) { Hero h = heros.get(i); System.out.println(h); } } }
步骤 2 :

迭代器遍历

使用迭代器Iterator遍历集合中的元素
迭代器遍历
package collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> heros = new ArrayList<Hero>(); //放5个Hero进入容器 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero name " +i)); } //第二种遍历,使用迭代器 System.out.println("--------使用while的iterator-------"); Iterator<Hero> it= heros.iterator(); //从最开始的位置判断"下一个"位置是否有数据 //如果有就通过next取出来,并且把指针向下移动 //直到"下一个"位置没有数据 while(it.hasNext()){ Hero h = it.next(); System.out.println(h); } //迭代器的for写法 System.out.println("--------使用for的iterator-------"); for (Iterator<Hero> iterator = heros.iterator(); iterator.hasNext();) { Hero hero = (Hero) iterator.next(); System.out.println(hero); } } }
步骤 3 :

用增强型for循环

使用增强型for循环可以非常方便的遍历ArrayList中的元素,这是很多开发人员的首选。

不过增强型for循环也有不足:
无法用来进行ArrayList的初始化
无法得知当前是第几个元素了,当需要只打印单数元素的时候,就做不到了。 必须再自定下标变量。
用增强型for循环
package collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> heros = new ArrayList<Hero>(); // 放5个Hero进入容器 for (int i = 0; i < 5; i++) { heros.add(new Hero("hero name " + i)); } // 第三种,增强型for循环 System.out.println("--------增强型for循环-------"); for (Hero h : heros) { System.out.println(h); } } }
步骤 4 :

练习-删除ArrayList中的数据

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
首先初始化一个Hero集合,里面放100个Hero对象,名称分别是从
hero 0
hero 1
hero 2
...
hero 99.

通过遍历的手段,删除掉名字编号是8的倍数的对象
步骤 5 :

答案-删除ArrayList中的数据

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

5分22秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


这个练习的考点是,不能够在使用Iterator和增强for循环遍历数据的同时,删除数据,否则会抛出ConcurrentModificationException

解决办法,是准备一个临时容器,专门用来保存需要删除的对象。 然后再删掉
package collection; import java.util.ArrayList; import java.util.List; import charactor.Hero; public class TestCollection { public static void main(String[] args) { List<Hero> heros = new ArrayList<Hero>(); // 放100个Hero进入容器 for (int i = 0; i < 100; i++) { heros.add(new Hero("hero name " + i)); } //准备一个容器,专门用来装要删除的对象 List<Hero> deletingHeros = new ArrayList<>(); for (Hero h : heros) { int id = Integer.parseInt(h.name.substring(10)); if (0 == id % 8) deletingHeros.add(h); } for (Hero h : deletingHeros) { heros.remove(h); } // heros.removeAll(deletingHeros); //直接通过removeAll删除多个Hero对象 System.out.println(heros); } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-09-20 做完了,睡觉》》》》》》
Hello_Cyoung



原ArrayList: Hero 0 Hero 1 Hero 2 Hero 3 Hero 4 Hero 5 Hero 6 Hero 7 Hero 8 Hero 9 Hero 10 Hero 11 Hero 12 Hero 13 Hero 14 Hero 15 Hero 16 Hero 17 Hero 18 Hero 19 Hero 20 Hero 21 Hero 22 Hero 23 Hero 24 Hero 25 Hero 26 Hero 27 Hero 28 Hero 29 Hero 30 Hero 31 Hero 32 Hero 33 Hero 34 Hero 35 Hero 36 Hero 37 Hero 38 Hero 39 Hero 40 Hero 41 Hero 42 Hero 43 Hero 44 Hero 45 Hero 46 Hero 47 Hero 48 Hero 49 Hero 50 Hero 51 Hero 52 Hero 53 Hero 54 Hero 55 Hero 56 Hero 57 Hero 58 Hero 59 Hero 60 Hero 61 Hero 62 Hero 63 Hero 64 Hero 65 Hero 66 Hero 67 Hero 68 Hero 69 Hero 70 Hero 71 Hero 72 Hero 73 Hero 74 Hero 75 Hero 76 Hero 77 Hero 78 Hero 79 Hero 80 Hero 81 Hero 82 Hero 83 Hero 84 Hero 85 Hero 86 Hero 87 Hero 88 Hero 89 Hero 90 Hero 91 Hero 92 Hero 93 Hero 94 Hero 95 Hero 96 Hero 97 Hero 98 Hero 99 现在的集合中元素的个数是:100 ------------------------------------------- 第一种方法:for循环遍历删除: Hero 0 Hero 1 Hero 2 Hero 3 Hero 4 Hero 5 Hero 6 Hero 7 Hero 9 Hero 10 Hero 11 Hero 12 Hero 13 Hero 14 Hero 15 Hero 17 Hero 18 Hero 19 Hero 20 Hero 21 Hero 22 Hero 23 Hero 25 Hero 26 Hero 27 Hero 28 Hero 29 Hero 30 Hero 31 Hero 33 Hero 34 Hero 35 Hero 36 Hero 37 Hero 38 Hero 39 Hero 41 Hero 42 Hero 43 Hero 44 Hero 45 Hero 46 Hero 47 Hero 49 Hero 50 Hero 51 Hero 52 Hero 53 Hero 54 Hero 55 Hero 57 Hero 58 Hero 59 Hero 60 Hero 61 Hero 62 Hero 63 Hero 65 Hero 66 Hero 67 Hero 68 Hero 69 Hero 70 Hero 71 Hero 73 Hero 74 Hero 75 Hero 76 Hero 77 Hero 78 Hero 79 Hero 81 Hero 82 Hero 83 Hero 84 Hero 85 Hero 86 Hero 87 Hero 89 Hero 90 Hero 91 Hero 92 Hero 93 Hero 94 Hero 95 Hero 97 Hero 98 Hero 99 现在的集合中元素的个数是:88 ------------------------------------------- 第二种方法:利用迭代器Iterator删除元素: Hero 0 Hero 1 Hero 2 Hero 3 Hero 4 Hero 5 Hero 6 Hero 7 Hero 9 Hero 10 Hero 11 Hero 12 Hero 13 Hero 14 Hero 15 Hero 17 Hero 18 Hero 19 Hero 20 Hero 21 Hero 22 Hero 23 Hero 25 Hero 26 Hero 27 Hero 28 Hero 29 Hero 30 Hero 31 Hero 33 Hero 34 Hero 35 Hero 36 Hero 37 Hero 38 Hero 39 Hero 41 Hero 42 Hero 43 Hero 44 Hero 45 Hero 46 Hero 47 Hero 49 Hero 50 Hero 51 Hero 52 Hero 53 Hero 54 Hero 55 Hero 57 Hero 58 Hero 59 Hero 60 Hero 61 Hero 62 Hero 63 Hero 65 Hero 66 Hero 67 Hero 68 Hero 69 Hero 70 Hero 71 Hero 73 Hero 74 Hero 75 Hero 76 Hero 77 Hero 78 Hero 79 Hero 81 Hero 82 Hero 83 Hero 84 Hero 85 Hero 86 Hero 87 Hero 89 Hero 90 Hero 91 Hero 92 Hero 93 Hero 94 Hero 95 Hero 97 Hero 98 Hero 99 现在的集合中元素的个数是:88 ------------------------------------------- 第三种方法:利用增强型for循环遍历集合并删除: Hero 0 Hero 1 Hero 2 Hero 3 Hero 4 Hero 5 Hero 6 Hero 7 Hero 9 Hero 10 Hero 11 Hero 12 Hero 13 Hero 14 Hero 15 Hero 17 Hero 18 Hero 19 Hero 20 Hero 21 Hero 22 Hero 23 Hero 25 Hero 26 Hero 27 Hero 28 Hero 29 Hero 30 Hero 31 Hero 33 Hero 34 Hero 35 Hero 36 Hero 37 Hero 38 Hero 39 Hero 41 Hero 42 Hero 43 Hero 44 Hero 45 Hero 46 Hero 47 Hero 49 Hero 50 Hero 51 Hero 52 Hero 53 Hero 54 Hero 55 Hero 57 Hero 58 Hero 59 Hero 60 Hero 61 Hero 62 Hero 63 Hero 65 Hero 66 Hero 67 Hero 68 Hero 69 Hero 70 Hero 71 Hero 73 Hero 74 Hero 75 Hero 76 Hero 77 Hero 78 Hero 79 Hero 81 Hero 82 Hero 83 Hero 84 Hero 85 Hero 86 Hero 87 Hero 89 Hero 90 Hero 91 Hero 92 Hero 93 Hero 94 Hero 95 Hero 97 Hero 98 Hero 99 现在的集合中元素的个数是:88
package setFrame;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Ergodic {
	public static void main(String[] args) {
		List<Hero> heros = new ArrayList<>();
		System.out.println("原ArrayList:");
		for(int i=0;i<100;i++) {
			heros.add(new Hero("Hero "+i));
			System.out.println(heros.get(i));
		}
		System.out.println("现在的集合中元素的个数是:"+heros.size());
		
		System.out.println("-------------------------------------------");
		
//		通过遍历的手段,删除掉名字编号是8的倍数的对象
		
//		第一种方法:for循环遍历删除
		/*思路:
		 * 先用循环遍历ArrayList中的元素
		 * 然后利用重写的toString方法获得字符串形式的类名
		 * 利用字符串的判断内容方法找出为8的倍数的元素
		 * 将其删除
		 */
		
		{
			System.out.println("第一种方法:for循环遍历删除:");
			for(int i=0;i<heros.size();i++) {
//				System.out.println(heros.get(i));
				int id = Integer.parseInt(heros.get(i).toString().substring(5));
//				System.out.println(id);
				if(id != 0 && id%8 == 0)
					heros.remove(heros.get(i));
				System.out.println(heros.get(i));
			}
			System.out.println("现在的集合中元素的个数是:"+heros.size());
		}
		
		
		System.out.println("-------------------------------------------");
		
//		第二种方法:利用迭代器Iterator删除元素
		
		{
			System.out.println("第二种方法:利用迭代器Iterator删除元素:");
//			创建迭代器对象:
			Iterator<Hero> it = heros.iterator();
			while(it.hasNext()) {
				Hero h = it.next();
				int id = Integer.parseInt(h.toString().substring(5));
				if(id != 0 && id%8 == 0)
//					heros.remove(h);	//会导致抛出java.util.ConcurrentModificationException异常,
										//因为在遍历是对集合进行了修改
					it.remove();	//推荐使用
				System.out.println(h);
			}
			System.out.println("现在的集合中元素的个数是:"+heros.size());
		}
		
		
		System.out.println("-------------------------------------------");
		
//		第三种方法:利用增强型for循环遍历集合并删除
		{
			System.out.println("第三种方法:利用增强型for循环遍历集合并删除:");
			List<Hero> list_remove = new ArrayList<>();	//新建一个集合
			for(Hero each : heros) {
				int id = Integer.parseInt(each.toString().substring(5));
				if(id != 0 && id%8 == 0) {
//					heros.remove(each);		//会导致抛出java.util.ConcurrentModificationException异常,
											//因为在遍历是对集合进行了修改
					list_remove.add(each);	//将要移除的元素放到一个集合里面
				}
			}
			heros.removeAll(list_remove);	//移除集合中的所有元素
			
			for(Hero each : heros) {
				System.out.println(each);
			}
			System.out.println("现在的集合中元素的个数是:"+heros.size());
		}
		
	}
}

							


1 个答案

达到了 答案时间:2018-10-10
第一个是错误的,删除了就向前移动了一位,下一个就变成下2个了




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-09-05 作业答案
1019773823



作业答案
public class 遍历Arraylist {
     public static void main(String[] args) {
    	 List<Hero> heros=new ArrayList<Hero>();
		for (int i = 0; i < 100; i++) {
			heros.add( new Hero("hero "+i));
		}
		
		for (int i = 0; i < heros.size(); i++) {
			int id= Integer.parseInt(heros.get(i).getName().substring(5));
			if(id!=0&&id%8==0) {
				heros.remove(i);
			}
		}
		for (Hero hero : heros) {
			System.out.println(hero.name);
		}	
		
	}
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-28 交作业
2018-08-19 哇~!终于搞定了!我不用i%8==0做!交作业!
2018-08-01 交作业,倒序删除最优化
2018-07-30 交作业
2018-07-23 Iterator<Hero> iterator = heros.iterator(); iterator.hasNext();求解释
2018-07-11 站长答案第26行为啥还是用了增强for循环删除呢?
2018-07-03 为什么删除的是9的倍数啊???
2018-06-29 作业
2018-06-18 使用迭代器遍历能获得当前索引的指针吗
2018-05-21 迭代器可以删除元素
2018-04-17 解题方法
2018-03-07 练习--删除ArrayList中的数据
2018-03-02 联系题
2018-01-01 不能在遍历数据时候删除数据是因为指令重排么?
2017-12-05 试了下,发现迭代器遍历的时候可以进行删除操作
2017-12-05 迭代器遍历之后还能变回ArrayList吗?遍历之后还能让指针指回开始的空吗?
2017-11-30 关于练习题,分享下代码
2017-11-30 分析下练习题思路
2017-11-11 使用Iterator在循环遍历时也可以进行删除操作
2017-10-15 更好的方法:从末位开始遍历
2017-08-01 站长大人,使用迭代器循环的时候,可以进行增删操作吧?
2017-05-15 我想到另一个方法
2017-03-22 迭代器while循环




提问之前请登陆
关于 JAVA 中级-集合框架-遍历 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 902680467
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图