ArrayList和HashMap的遍历选择删除,集合的迭代删除
ArrayList的遍历删除
ArrayList实现了Collection接口,Collection又继承了Iterable接口,所以Collection接口下的所有实现类都可以通过iterator()方法创建迭代器对象。
ArrayList初始化
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三", 18));
students.add(new Student("李四", 20));
students.add(new Student("王五", 20));
方法1
通过普通for循环遍历索引删除:
for (int i = 0; i < students.size(); i++) {
if (students.get(i).getAge() == 20){ //获得当前下标元素
students.remove(i); //通过下标移除元素
i--; //移除元素后,后面元素自动前移,迭代器i--;
}
}
Student{name='张三', age=18}
Process finished with exit code 0
注意:
如果循环从0开始,删除元素后,后面元素会自动前移,i 需要-1;
如果从后往前开始循环,正常即可。
方法2
使用iterator()迭代器进行遍历删除:
Iterator<Student> it = students.iterator();
while (it.hasNext()){
if(it.next().getAge()==20){
it.remove();
}
}
Student{name='张三', age=18}
Process finished with exit code 0
方法3(常用方法,推荐)
在JDK1.8之后允许使用Lambda表达式实现。
推荐使用removeIf()方法,让代码更加优雅。
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三", 18));
students.add(new Student("李四", 20));
students.add(new Student("王五", 20));
students.removeIf(entry->entry.getAge()==20); //遍历寻找删除
students.forEach(System.out::println); //遍历打印
Student{name='张三', age=18}
Process finished with exit code 0
removeIf()的内部实现用的就是迭代器
HashMap的遍历删除
HashMap并不是接口Collection下的实现类,不能直接获取Iteraotr对象。
初始化HashMap:
HashMap<Integer, String> testHashMap = new HashMap<>();
testHashMap.put(1, "AAA");
testHashMap.put(4,"AAA");
testHashMap.put(2, "Two");
testHashMap.put(3, "Three");
方法1
使用entrySet或者keySet,用List记录需要删除的元素key,然后通过remove(key)方法删除
ArrayList<Integer> removeKey = new ArrayList<>(); //创建List集合接收需要删除元素的key
for (Map.Entry<Integer,String> e:testHashMap.entrySet()){ //遍历map的entrySet
if(e.getValue().equals("AAA")){ //判断需要删除的元素
removeKey.add(e.getKey()); //将需要删除的元素的key添加进List中
}
}
removeKey.forEach(testHashMap::remove); //通过List中的key删除,使用的是remove(key)方法
System.out.println(testHashMap); //打印
{2=Two, 3=Three}
Process finished with exit code 0
方法2(常用)
使用entrySet来获取迭代器对象,进行遍历删除
Iterator<Map.Entry<Integer, String>> it= testHashMap.entrySet().iterator();//通过entrySet获取迭代器对象
while (it.hasNext()){ //使用迭代器进行遍历
if("AAA".equals(it.next().getValue())){ //值判断
it.remove(); //删除
}
}
System.out.println(testHashMap); //打印
{2=Two, 3=Three}
Process finished with exit code 0
方法3(常用)(Lambda)
在JDK1.8之后允许使用Lambda表达式实现。
推荐使用removeIf()方法,让代码更加优雅。
HashMap<Integer, String> testHashMap = new HashMap<>(); //初始化
testHashMap.put(1, "AAA");
testHashMap.put(4,"AAA");
testHashMap.put(2, "Two");
testHashMap.put(3, "Three");
testHashMap.entrySet().removeIf(o->o.getValue().equals("AAA")) ;//遍历选择删除
System.out.println(testHashMap); //打印
{2=Two, 3=Three}
Process finished with exit code 0