美文网首页
动态数组

动态数组

作者: 不二不二熊 | 来源:发表于2018-09-25 10:21 被阅读0次

数组应该是我们在java中最先接触的数据结构了,在本章节中,我们尝试自己重新封装实现动态数组。

一、自定义数组及构造
public class Array {
    private int[] data;
    private int size;

    /**
     * 带参构造方法
     *
     * @param capacity
     */
    public Array(int capacity) {
        data = new int[capacity];
        size = 0;
    }

    /**
     * 无参构造,默认初始化容量为10
     */
    public Array() {
        this(10);
    }

    /**
     * 获取实际长度
     *
     * @return
     */
    public int getSize() {
        return size;
    }

    /**
     * 获取数组容量
     *
     * @return
     */
    public int getCapacity() {
        return data.length;
    }

    /**
     * 判断动态数组是否为空
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }
}

二、插入方法

在指定位置插入元素,判断是否越界以及索引是否合法,在插入后记得维护size变量

/**
     * 在数组的第一个位置插入
     *
     * @param element
     */
    public void addFirst(int element) {
        add(0, element);
    }

    /**
     * 在数组末尾插入
     * @param element
     */
    public void addLast(int element) {
        add(size, element);
    }

    /**
     * 在指定位置插入元素
     *
     * @param index
     * @param element
     */
    public void add(int index, int element) {
        //判断是否超出容量
        if (size == data.length) {
            throw new IllegalArgumentException("Add fail ,array is full");
        }
        //判断index是否合法
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("index is illegal ");
        }
        //从index开始元素依次后移
        for (int i = size - 1; i >= index; i--) {
            data[i + 1] = data[i];
        }
        //将元素插入到指定位置
        data[index] = element;
        //维护size变量
        size++;
    }

三、查询、修改

/**
     * 获取index位置的元素
     *
     * @param index
     * @return
     */
    public int get(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Get failed. Index is illegal");
        }
        return data[index];
    }

    /**
     * 修改index位置的元素为element
     *
     * @param index
     */
    public void set(int index, int element) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Get failed. Index is illegal");
        }
        data[index] = element;
    }

    /**
     * 重写toString方法
     *
     * @return
     */
    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append(String.format("Array: size = %d , capacity = %d\n", size, data.length));
        res.append("[");
        for (int i = 0; i < size; i++) {
            res.append(data[i]);
            if (i != size - 1) {
                res.append(",");
            }
        }
        res.append("]");
        return res.toString();
    }
}

四、包含、搜索与删除

/**
     * 查找数组中是否含有元素element
     *
     * @param element
     * @return
     */
    public boolean contains(int element) {
        for (int i = 0; i < size; i++) {
            if (data[i] == element) {
                return true;
            }
        }
        return false;
    }

    /**
     * 查找数组中元素e所在的索引,如果不存在元素e,则返回-1
     *
     * @param element
     * @return
     */
    public int find(int element) {
        for (int i = 0; i < size; i++) {
            if (data[i] == element) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 从数组中删除index位置的元素, 返回删除的元素
     *
     * @param index
     * @return
     */
    public int remove(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Remove failed. Index is illegal");
        }
        for (int i = index + 1; i < size; i++) {
            data[i - 1] = data[i];
        }
        size--;
        return data[index];
    }

    /**
     * 从数组中删除第一个元素, 返回删除的元素
     *
     * @return
     */
    public int removeFirst() {
        return remove(0);
    }

    /**
     * 从数组中删除最后一个元素, 返回删除的元素
     *
     * @return
     */
    public int removeLast() {
        return remove(size - 1);
    }

    /**
     * 从数组中删除element
     *
     * @param element
     */
    public void removeElement(int element) {
        int index = find(element);
        if (index != -1) {
            remove(index);
        }

    }

相关文章

  • 20_总结

    一、动态数组 普通动态数组 环形动态数组 接口设计 int size(){} // 元素的数量 boolean i...

  • C语言动态数组

    一维动态数组 二维动态数组

  • C语言 泛型动态数组

    泛型实现思路:万能指针void *动态数组实现思路:动态进行数组内存的扩容 realloc 泛型动态数组 数组可以...

  • C++ 动态顺序表的实现(更新中)

    动态数组与数组相似,但是动态数组的大小可以在运行时动态修改。动态数组的元素占用连续的内存块,一旦创建,就无法更改其...

  • 笨办法学C 练习34:动态数组

    练习34:动态数组 原文:Exercise 34: Dynamic Array 译者:飞龙 动态数组是自增长的数组...

  • VBA之数组

    数组的声明 一维数组 二维数组 动态数组

  • 数据结构大纲

    1、线性表 1.1、数组 1.1.1、简介 数组是一段连续的内存 1.1.2、动态数组 有动态扩容功能和动态缩容功...

  • 关于ArrayList

    ArrayList简介 ArrayList内部是以动态数组存放数据的,所谓动态数组,不是数组本身可以改变长度,而是...

  • 2018-11-28

    vector容器。 vector类称为向量类,实现了动态数组,用于元素数组动态变化的对象数组。同数组一样,vect...

  • C++ 创建动态二维数组

    有时候数组过大,栈放不下,可以利用动态分配生成动态数组 动态创建数组时一定要记得结束程序时释放内存。

网友评论

      本文标题:动态数组

      本文链接:https://www.haomeiwen.com/subject/jpnfoftx.html