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

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


 
  
  1. package com.lzz.list; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.Iterator; 
  5. import java.util.List; 
  6.  
  7. /* 
  8.  * 这是编码中出现的一个错误,记录反思下 
  9.  * 把一个list对象集合过滤后仍返回 
  10.  * @author lzz 
  11.  */ 
  12. public class ListFilter { 
  13.     //过滤掉年龄是12到18的小孩 
  14.     public static void main(String[] args) { 
  15.         List list=new ArrayList(); 
  16.         list.add(new UserVo("Apple"13)); 
  17.         list.add(new UserVo("Orange"16)); 
  18.         list.add(new UserVo("Banana",20)); 
  19.          
  20.         List nlist=filterList(list); 
  21.         Iterator it=nlist.iterator(); 
  22.         System.out.println("过滤后的结果"); 
  23.         while(it.hasNext()){ 
  24.             System.out.println(((UserVo)it.next()).getUsername()); 
  25.         } 
  26.          
  27.     } 
  28.     public static List filterList(List list){ 
  29.         for(int i=0;i<list.size();i++){ 
  30.             System.out.println("第 "+i+"次循环"); 
  31.             for(int j=0;j<list.size();j++){              
  32.                 System.out.println(((UserVo)list.get(j)).getUsername()+"  "+list.indexOf(list.get(j))); 
  33.             } 
  34.             int age=((UserVo)list.get(i)).getAge(); 
  35.             if(age>12&&age<18){ 
  36.                 System.out.println("删除的是:"+((UserVo)list.get(i)).getUsername()); 
  37.                 list.remove(i); //图省事搞了个×××烦
  38.             } 
  39.         } 
  40.         return list; 
  41.     } 
  42.  
  43.  
  44. /** 
  45.  * 要进行过滤的类 
  46.  * @author lzz 
  47.  */ 
  48. class UserVo{ 
  49.     private String username; 
  50.     private int age; 
  51.     public UserVo(){ 
  52.          
  53.     } 
  54.     public UserVo(String username,int age){ 
  55.         this.username=username; 
  56.         this.age=age; 
  57.     } 
  58.     public String getUsername() { 
  59.         return username; 
  60.     } 
  61.     public void setUsername(String username) { 
  62.         this.username = username; 
  63.     } 
  64.     public int getAge() { 
  65.         return age; 
  66.     } 
  67.     public void setAge(int age) { 
  68.         this.age = age; 
  69.     } 
  70.      

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

 

 
  
  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,最后一并删除完返回就好了。