首页 > 其他 > 详细

自定义实现的ArrayList以及自定义实现的Iterator迭代器

时间:2019-12-12 15:18:59      阅读:125      评论:0      收藏:0      [点我收藏+]

    ArrayList的底层是长度可动态变化的数组,其适用于查找多,修改少的情况,原因是数组的元素的增加删除元素会涉及大量元素的移动,效率比较低。

首先创建一个类,创建一个数组和size属性。

 

private Object[] elementData;
private int size;

    public MyArrayLIst(){
        this(5);
    }
    //初始化
    public MyArrayLIst(int size) {
        this.elementData = new Object[size];
        this.size = 0;
    }

 

获取ArrayList的元素个数:

/**
     * 获取元素个数
     */
    public int size() {
        return size;
    }

 

添加元素:涉及到当前的数组是否满需要扩容的情况,即满则扩容

/**
     * 添加元素
     */
    public boolean add(T value) {
        //满则扩容
        if (size == elementData.length) {
            elementData = Arrays.copyOf(elementData, elementData.length * 2);
        }
        elementData[size] = value;
        size++;
        return true;
    }

 

通过下标获取某个元素:应该判断其参数的合法性

/**
     * 获取元素
     */
    public T get(int index) {
        T data = (T) new Object();
        if (index >= size || index < 0) {
            throw new RuntimeException("参数不合法");
        } else {
            data = (T) elementData[index];
        }
        return data;
    }

 

删除元素:删除元素涉及到元素的移动,便需要将删除元素的后面所有元素向前移动

/**
     * 删除元素
     */
    public boolean remove(int index) {
        if (index >= size || index < 0) {
            throw new RuntimeException("参数不合法");
        } else {
            for (int i = index; i < size; i++) {
                //元素的移动
                elementData[i] = elementData[i + 1];
            }
            elementData[size - 1] = null;//便于GC的回收
            size--;
        }

        return true;
    }

 

要实现Iterator的接口,便需要自定义的ArrayList实现Iterable接口 ,重写他的Iterator接口,并且重写其下的方法,其中包含三个主要的方法

boolean  hasNext()

判断 iterator 内是否存在下1个元素,如果存在,返回true,否则返回false。

T next()

返回 iterator 内下1个元素,同时上面的指针向后移动一位。
故,如果不断地循环执行next()方法,就可以遍历容器内所有的元素了。

void remove()

删除 iterator 内指针的前1个元素,前提是至少执行过1次next();
(这个方法不建议使用,建议使用容器本身的romove 方法)。

 

 @Override
    public Iterator<T> iterator() {
        return new str();
    }

由于其返回的是一个对象,便需要创建一个内部类,来实现其中的方法,代码如下:

 class str implements Iterator<T>{
        int i;
        public str(){
            i = 0;
        }
        @Override
        public boolean hasNext() {
            if(i < size()){
            return true;
            }
            return false;
        }

        @Override
        public T next() {
            if(false){
            }
            return (T)elementData[i++];
        }

      }

 

具体的完整代码如下:import java.util.Arrays;import java.util.Iterator;

public class MyArrayLIst<T> implements Iterable<T>{
    private Object[] elementData;
    private int size;

    public MyArrayLIst(){
        this(5);
    }
    //初始化
    public MyArrayLIst(int size) {
        this.elementData = new Object[size];
        this.size = 0;
    }

    /**
     * 添加元素
     */
    public boolean add(T value) {
        //满则扩容
        if (size == elementData.length) {
            elementData = Arrays.copyOf(elementData, elementData.length * 2);
        }
        elementData[size] = value;
        size++;
        return true;
    }

    /**
     * 获取元素
     */
    public T get(int index) {
        T data = (T) new Object();
        if (index >= size || index < 0) {
            throw new RuntimeException("参数不合法");
        } else {
            data = (T) elementData[index];
        }
        return data;
    }

    /**
     * 获取元素个数
     */
    public int size() {
        return size;
    }

    /**
     * 删除元素
     */
    public boolean remove(int index) {
        if (index >= size || index < 0) {
            throw new RuntimeException("参数不合法");
        } else {
            for (int i = index; i < size; i++) {
                //元素的移动
                elementData[i] = elementData[i + 1];
            }
            elementData[size - 1] = null;//便于GC的回收
            size--;
        }

        return true;
    }

    @Override
    public Iterator<T> iterator() {
        return new str();
    }

    class str implements Iterator<T>{
        int i;
        public str(){
            i = 0;
        }
        @Override
        public boolean hasNext() {
            //if(i < size()){
            //return true;
            //}
            //return false;
return i < size; //emmmm上面的写法觉得有点蠢
} @Override
public T next() { if(false){ } return (T)elementData[i++]; } @Override public void remove() { } } public static void main(String[] args) { MyArrayLIst<Integer> myArrayLIst = new MyArrayLIst<>(); myArrayLIst.add(9); myArrayLIst.add(8); myArrayLIst.add(1); myArrayLIst.add(2); myArrayLIst.add(3); myArrayLIst.add(5); System.out.println(myArrayLIst.size()); System.out.println(myArrayLIst.get(4)); // myArrayLIst.remove(1); // System.out.println(myArrayLIst.get(1)); Iterator iterator = myArrayLIst.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); } } }

 

测试如图:

技术分享图片

 

 

 

 

 

 

 

自定义实现的ArrayList以及自定义实现的Iterator迭代器

原文:https://www.cnblogs.com/128-cdy/p/12029302.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!