手写简易的List并实现filter功能

时间:2023-4-1    作者:z    分类: 开发日记


自定义简易的List,纯数组模拟实现,暴力实现动态扩容缩容,以及筛选功能。

实现方法:

  1. 获取元素get(int num) ,

  2. 添加add(T o),

  3. 根据下标删除removeByIndex(int index),

  4. 获取大小size(),

  5. 过滤元素filter(MyFilter filter)

public class MyList<T>{

    private T[] data;
    private Integer size;

    public MyList() {
        this.data = (T[]) new Object[1];
        this.size = 0;
    }

    public MyList(int n) {
        this.data = (T[]) new Object[n];
        this.size = 0;
    }

    //过滤元素
    public MyList<T> filter(MyFilter<T> filter) {
        MyList<T> res = new MyList<>();
        for (int i = 0; i < size; i++) {
            if (filter.filter(data[i])) {
                res.add(data[i]);
            }
        }
        return res;
    }

    //获取元素
    public T get(int  num) {
        if (num > size) {
            return null;
        }
        return data[num];
    }
    //添加元素
    public boolean add(T o) {
         //判断是否需要扩容
        reSize(size);
        size++;
        data[size - 1] = o;
        return true;
    }
    //根据下标删除
    public boolean removeByIndex(int index) {
        int  i = index;
        if (i >= size) {
            return false;
        }
        for (int j = i + 1; j < size; j++) {
            data[j - 1] = data[j];
        }
        //判断是否需要缩容
        reSize(size--);
        return true;
    }

    //获取容量大小
    public int size() {
        return size;
    }

    //扩容和缩容
    private void reSize(int size) {
        if (size + 1 > data.length) {
            T[] temp = (T[]) new Object[size * 2];
            for (int i = size - 1, in = 0; i >= in; i--) {
                temp[i] = data[i];
            }
            data = temp;
        }
        if (size <= data.length / 4 && data.length / 2 != 0) {
            T[] temp = (T[]) new Object[data.length / 2];
            for (int i = size - 1, in = 0; i >= in; i--) {
                temp[i] = data[i];
            }
            data = temp;
        }
    }

}

Filter接口

public interface MyFilter<T> {
    boolean filter(T obj);
}

测试1:

public class test{

   public static void main(String[] args){
       MyList<Integer> list =  new MyList<>(10);
       for(int i = 0; i <= 10; i ++){
           list.add(i);
       }
       for(int i = 0 ; i < list.size(); i ++){
           System.out.print(list.get(i) + ", ");
       }
        System.out.println();
        MyList<Integer> filter = list.filter((a) -> {
            return a % 2 == 0;
        });
        filter.removeByIndex(2);
        filter.add(111);
        for(int i = 0 ; i < filter.size(); i ++){
            System.out.print(filter.get(i) + ", ");
        }
   }
}

输出结果:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
0, 2, 6, 8, 10, 111, 

测试2:

public class test {
 public static void main(String[] args) {
        MyList<Person> list = new MyList<>();
        Person person1 = new Person("小明", 12);
        list.add(person1);
        Person person2 = new Person("小红", 14);
        list.add(person2);
        Person person3 = new Person("张三", 15);
        list.add(person3);
        Person person4 = new Person("老刘", 22);
        list.add(person4);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).toString());
        }
        //筛选年龄大于13的对象
        MyList<Person> filter1 = list.filter(a -> {
            return a.getAge() > 13;
        });
        System.out.println("筛选年龄大于13的对象: ");
        for (int i = 0; i < filter1.size(); i++) {
            System.out.println(filter1.get(i).toString());
        }
        //筛选名字带“小”的对象
        MyList<Person> filter2 = list.filter(a -> {
            return a.getName().contains("小");
        });
        System.out.println("筛选名字带“小”的对象: ");
        for (int i = 0; i < filter2.size(); i++) {
            System.out.println(filter2.get(i).toString());
        }
    }

    static class Person {
        private String name;
        private Integer age;

        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}

输出结果:

Person{name='小明', age=12}
Person{name='小红', age=14}
Person{name='张三', age=15}
Person{name='老刘', age=22}
筛选年龄大于13的对象: 
Person{name='小红', age=14}
Person{name='张三', age=15}
Person{name='老刘', age=22}
筛选名字带“小”的对象: 
Person{name='小明', age=12}
Person{name='小红', age=14}

实现起来很简单,虽然没有什么用,跟自带的List相差甚远,但有助于巩固java基础,了解List的底层原理。

标签: java java基础