package com.itheima;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
* 3、 一个ArrayList对象aList中存有若干个字符串元素,
* 现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素,
* 请用代码实现。
* */
@SuppressWarnings("unused")
public class Test17 {
public static void main(String[] args) {
List<String> aList = new ArrayList<String>();
aList.add("CSDN社区");
aList.add("abc");
aList.add("黑马程序员");
aList.add("黑马论坛");
aList.add("黑马程序员——安卓");
aList.add("黑马程序员——云计算");
aList.add("abc");
aList.add("我准备去黑马训练营了");
//解决办法,通过传统for循环的角标删除对应的元素
for(int i=0;i<aList.size();i++){
if(aList.get(i).equals("abc")){
aList.remove(i);
}
}
System.out.println(aList);
/**
* 如果使用增强for循环,那么将会报告java.util.ConcurrentModificationException
* 为什么会报告这个错误呢?
* 增强for循环底层调用的是Iterator迭代器的hasNext方法和next方法,因为ArrayList本身是一个固定长度的集合,
* 如果在迭代的时候对数据进行增删操作,那么将会引发异常。这是为什么呢?
*
* 增强for循环和Iterator遍历的效果是一样的,
* 也就说增强for循环的内部也就是调用Iteratoer实现的,
* 但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。迭代器也是一样。
* */
/*for(String str :aList){//aList的size现在是8
System.out.println(aList.size());
//第一次没有删除,size还是8,第二次打印的还是8。
if(str.equals("abc")){
//但是由于判断到了迭代到的元素是abc,那么删除。
aList.remove(str);//删除元素,这时就发生了java.util.ConcurrentModificationException
}
}
System.out.println(aList);*/
//解决办法:创建一个新的集合,把要删除的元素存储进新的集合
/*List <String> delList = new ArrayList();
for(String str :aList){
if(str.equals("abc")){
delList.add(str);
}
}
System.out.println(aList);//原集合
aList.removeAll(delList);
System.out.println(aList);//删除后的集合*/
//下面迭代器其原理跟增强for循环一样
//会发送java.util.ConcurrentModificationException异常
/*Iterator<String> it = aList.iterator();
while(it.hasNext()){
String str = it.next();
if(str.equals("abc")){
aList.remove(str);
}
}
System.out.println(aList);*/
/*List<String> delList = new ArrayList<String>();
Iterator<String> it = aList.iterator();
while (it.hasNext()) {
String str = it.next();
if(str.equals("abc")){
delList.add(str);
}
}
System.out.println(aList);//原集合
aList.removeAll(delList);
System.out.println(aList);//删除后的集合*/
}
}
|
|