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

来源:互联网 发布:网络学校国家承认吗 编辑:程序博客网 时间:2024/06/07 10:10

本来是要写一个对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
原创粉丝点击