Java--List 过滤引发的小错误

本来是要写一个对list里的对象过滤的简单的方法,写完之后发现总是不对啊。。。后来想了想,犯了个小错。

这里写下来提醒自己以后。。。。。

package com.lzz.list; 
 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
 
/* 
 * 这是编码中出现的一个错误,记录反思下 
 * 把一个list对象集合过滤后仍返回 
 * @author lzz 
 */ 
public class ListFilter { 
    //过滤掉年龄是12到18的小孩 
    public static void main(String[] args) { 
        List list=new ArrayList(); 
        list.add(new UserVo("Apple", 13)); 
        list.add(new UserVo("Orange", 16)); 
        list.add(new UserVo("Banana",20)); 
         
        List nlist=filterList(list); 
        Iterator it=nlist.iterator(); 
        System.out.println("过滤后的结果"); 
        while(it.hasNext()){ 
            System.out.println(((UserVo)it.next()).getUsername()); 
        } 
         
    } 
    public static List filterList(List list){ 
        for(int i=0;i<list.size();i++){ 
            System.out.println("第 "+i+"次循环"); 
            for(int j=0;j<list.size();j++){              
                System.out.println(((UserVo)list.get(j)).getUsername()+"  "+list.indexOf(list.get(j))); 
            } 
            int age=((UserVo)list.get(i)).getAge(); 
            if(age>12&&age<18){ 
                System.out.println("删除的是:"+((UserVo)list.get(i)).getUsername()); 
                list.remove(i); //图省事搞了个大麻烦
            } 
        } 
        return list; 
    } 
} 
 
 
/** 
 * 要进行过滤的类 
 * @author lzz 
 */ 
class UserVo{ 
    private String username; 
    private int age; 
    public UserVo(){ 
         
    } 
    public UserVo(String username,int age){ 
        this.username=username; 
        this.age=age; 
    } 
    public String getUsername() { 
        return username; 
    } 
    public void setUsername(String username) { 
        this.username = username; 
    } 
    public int getAge() { 
        return age; 
    } 
    public void setAge(int age) { 
        this.age = age; 
    } 
     
} 


--------------------------------------

 

 
 
  1. 第 0次循环 
  2. Apple  0 
  3. Orange  1 
  4. Banana  2 
  5. 删除的是:Apple 
  6. 第 1次循环 
  7. Orange  0 
  8. Banana  1 
  9. 过滤后的结果 
  10. Orange 
  11. Banana 

这里很容易看出来,本来以为把过滤掉的对象删除就好了,结果省事造成了麻烦。

当Apple对象过滤之后,对象的长度变了,原来index为2的Banana变成了1,下次循环的

时候orange就被忽视掉了。。。所以最后的结果当然是错误的。Orange根本就没有判断呢。

解决方法1  new一个list接收没有被删除的对象,然后返回就好了

                2 用数组记录下要被删除对象的index,最后一并删除完返回就好了。

本文出自 orangleliu笔记本 博客,请务必保留此出处http://blog.csdn.net/orangleliu/article/details/38309341

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值