愿天堂永无bug

本文分析了在ArrayList中遍历并删除元素时导致部分元素未被删除的原因,并提出从后向前遍历的解决方案。同时,针对查询容器中对象信息时只返回第一个匹配对象的问题,指出了错误的if判断结构,并提供了修正后的代码。
摘要由CSDN通过智能技术生成


问题描述

 在删除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 ;//还没有向容器中放入对象
}

 

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值