本来是要写一个对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;
}
}
--------------------------------------
- 第 0次循环
- Apple 0
- Orange 1
- Banana 2
- 删除的是:Apple
- 第 1次循环
- Orange 0
- Banana 1
- 过滤后的结果
- Orange
- Banana
这里很容易看出来,本来以为把过滤掉的对象删除就好了,结果省事造成了麻烦。
当Apple对象过滤之后,对象的长度变了,原来index为2的Banana变成了1,下次循环的
时候orange就被忽视掉了。。。所以最后的结果当然是错误的。Orange根本就没有判断呢。
解决方法1 new一个list接收没有被删除的对象,然后返回就好了
2 用数组记录下要被删除对象的index,最后一并删除完返回就好了。
本文出自 “orangleliu笔记本” 博客,请务必保留此出处http://blog.csdn.net/orangleliu/article/details/38309341