本来是要写一个对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,最后一并删除完返回就好了。
转载于:https://blog.51cto.com/orangleliu/998774