问题描述
在删除ArrayList容器中的元素时,会导致有些满足删除条件的元素而又没有被删除的情况
输出元素的代码:
public class ArrayListDemo1 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>();//创建容器 //向容器中添加元素 list.add(98); list.add(77); list.add(66); list.add(89); list.add(79); list.add(50); list.add(100); System.out.println("原来的全部成绩:" +list); //遍历容器,删除分数低于80的成绩 for (int i = 0; i < list.size(); i++) { if(list.get(i)<80){ list.remove(i); } }
运行后的结果:并未将低于80分的成绩全部删除
原因分析:
在ArrayList容器中删除一个数据后,该数据后面元素的地址会全部往前移动一个,所以直接从前往后遍历的话,会导致有的元素漏掉,从而也就无法到达预期的效果。
解决方案:
既然在删除一个元素后,后面的元素会向前移动,那么就可以从后向前遍历,即使移动了也不会导致漏点遍历某些元素
public class ArrayListDemo1 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(98); list.add(77); list.add(66); list.add(89); list.add(79); list.add(50); list.add(100); System.out.println("原来的全部成绩:" +list); //从后往前遍历 for(int i = list.size()-1; i > 0; i--){ if(list.get(i)<80){ list.remove(i); } } System.out.println("删除低于八十分的成绩后:" +list); } }
关于两个if后造成的问题
问题描述
在容器中放入几个对象之后,根据某个属性只能读出第一个放入的对象信息,后面的显示无法找到,但是遍历容器又显示有。
主要返回学生信息代码:
public static Student FindById(int id,ArrayList<Student> list) { //根据id查找学生信息 for (int i = 0; i < list.size(); i++) { Student student = list.get(i); if (student != null) { if (id == student.getId()) { return student; } else return null; } } return null;//还没有向容器中放入对象}
原因分析:
//*****真正的问题,是括号的原因。。。。。。else应该对应第一个if***** 此处为错误判读判断,只能读取第一个元素 因为当遍历第一个元素时,如果ID不等于student.getId(),则会直接返回null,不会在进行循环了 所以根据id查询一直只会返回第一个元素,后面的就无法查到了
最后将else对应第一个判断的if就可以了:
public static Student FindById(int id,ArrayList<Student> list) { //根据id查找学生信息 for (int i = 0; i < list.size(); i++) { Student student = list.get(i); if(student!=null){ if(id==student.getId()){ return student; } }else return null; } return null ;//还没有向容器中放入对象 }