zoukankan      html  css  js  c++  java
  • 泛型动态数组

    前言

    动态数组是指在声明时没有确定数组大小的数组,可以在任何时候改变大小,使用动态数组的优点是可以根据用户需要,有效利用存储空间。


    具体实现

    • 自定义泛型动态数组
    public class Array<T> {
    
        private T[] data;
        private int size;
    
        /**
         * 构造函数,传入数组的容量capacity构造Array
         * @param capacity
         */
        public Array (int capacity) {
            data = (T[]) new Object[capacity];
            size = 0;
        }
    
        /**
         * 无参构造函数,默认capacity=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;
        }
    
        /**
         * 向所有元素后添加一个新元素
         * @param e
         */
        public void addLast (T e) {
            add(size, e);
        }
    
        /**
         * 在所有元素前添加一个新元素
         * @param e
         */
        public void addFirst (T e) {
            add(0, e);
        }
    
        /**
         * 在第index个位置插入新元素e
         * @param index
         * @param e
         */
        public void add (int index, T e) {
    
            if (index < 0 || index > size) {
                throw new IllegalArgumentException("Add failed. Require index >= 0 || index < size.");
            }
    
            /**
             * 数组扩容
             */
            if (size == data.length) {
                resize(2 * data.length);
            }
    
            for (int i = size -1; i >= index; i --) {
                data[i + 1] = data[i];
            }
    
            data[index] = e;
            size ++;
        }
    
        /**
         * 获取index索引位置元素
         * @param index
         * @return
         */
        public T get (int index) {
            if (index < 0 || index >= size) {
                throw new IllegalArgumentException("Get failed. Index is illegal.");
            }
            return data[index];
        }
    
        /**
         * 获取第一个元素
         * @return
         */
        public T getFirst () {
            return get(0);
        }
    
        /**
         * 获取最后一个元素
         * @return
         */
        public T getLast () {
            return get(size -1);
        }
    
        /**
         * 修改index索引位置的元素为e
         * @param index
         * @param e
         */
        void set (int index, T e) {
            if (index < 0 || index >= size) {
                throw new IllegalArgumentException("Get failed. Index is illegal.");
            }
            data[index] = e;
        }
    
        /**
         * 查找数组中是否有元素e
         * @param e
         * @return
         */
        public boolean contains (int e) {
            for (int i = 0; i < size; i++) {
                if (data[i].equals(e)) {
                    return true;
                }
            }
    
            return false;
        }
    
        /**
         * 查找数组中元素e所在的索引
         * @param e
         * @return
         */
        public int find (int e) {
            for (int i = 0; i < size; i++) {
                if (data[i].equals(e)) {
                    return i;
                }
            }
    
            return -1;
        }
    
        /**
         * 从数组中删除index位置的元素,返回删除的元素
         * @param index
         * @return
         */
        public T remove (int index) {
            if (index < 0 || index >= size) {
                throw new IllegalArgumentException("Remove failed. Index is illegal.");
            }
    
            T ret = data[index];
    
            for (int i = index + 1; i < size; i++) {
                data[i -1] = data[i];
            }
    
            size --;
            //loitering objects != memory leak
            data[size] = null;
    
            /**
             * 数组缩容
             */
            if (size == data.length / 4) {
                resize(data.length / 2);
            }
    
            return ret;
        }
    
        /**
         * 从数组中删除第一个元素,返回删除的元素
         * @return
         */
        public T removeFirst () {
            return remove(0);
        }
    
        /**
         * 从数组中删除最后一个元素,返回删除的元素
         * @return
         */
        public T removeLast () {
            return remove(size -1);
        }
    
        /**
         * 从数组中删除元素e
         * @param e
         */
        public boolean removeElement (int e) {
            int index = find(e);
            if (index != -1) {
                remove(index);
                return true;
            }
    
            return false;
        }
    
        /**
         * 动态数组
         * @param newCapacity
         */
        private void resize(int newCapacity){
            T[] newData = (T[]) new Object[newCapacity];
            for (int i = 0; i < size; i++) {
                newData[i] = data[i];
            }
            data = newData;
        }
    
        /**
         * 重写toString
         * @return
         */
        @Override
        public String toString () {
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append(String.format("Array: size = %d, capacity = %d
    ", size, data.length));
            stringBuffer.append("[");
            for (int i = 0; i < size; i++) {
                stringBuffer.append(data[i]);
                if (i != size - 1) {
                    stringBuffer.append(", ");
                }
            }
            stringBuffer.append("]");
            return stringBuffer.toString();
        }
    
        public static void main(String[] args) {
            Array<Integer> arr = new Array<>();
            for (int i = 0; i < 10; i++) {
                arr.addLast(i);
            }
            System.out.println(arr);
    
            arr.add(1, 100);
            System.out.println(arr);
    
            arr.addFirst(-1);
            System.out.println(arr);
    
            arr.remove(2);
            System.out.println(arr);
    
            arr.removeElement(-1);
            System.out.println(arr);
        }
    
    }
    
    - End -
    一个努力中的公众号
    关注一下吧
    以上为本篇文章的主要内容,希望大家多提意见,如果喜欢记得点个推荐哦
    作者:Maggieq8324
    本文版权归作者和博客园共有,欢迎转载,转载时保留原作者和文章地址即可。
  • 相关阅读:
    WEB前端工程师 – 职业生涯规划
    求Sn=a+aa+aaa+…+aaa…a的值
    输入一行字符,分别统计出其中英文字母 空格 数字和其他字符的个数
    getchar()的用法!
    求1+2+…+n的和不大于1000的最大自然数n
    编程打印输出*金字塔
    从键盘输入一个整数,判断该数是否回文数.
    编程求"水仙花数"
    编程求出1000以内的完全数
    输入两个正整数,求它们的最大公约数和最小公倍数.
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/14864863.html
Copyright © 2011-2022 走看看