zoukankan      html  css  js  c++  java
  • 简单实现一个动态数组

    首先动态数组应该具有的特性:可以动态扩容,本身属于链表 Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList。

    动态数组应该具有的属性:

    int size(); // 元素的数量
    boolean isEmpty(); // 是否为空
    boolean contains(E element); // 是否包含某个元素
    void add(E element); // 添加元素到最后面
    E get(int index); // 返回index位置对应的元素
    E set(int index, E element); // 设置index位置的元素
    void add(int index, E element); // 往index位置添加元素
    E remove(int index); // 删除index位置对应的元素
    int indexOf(E element); // 查看元素的位置
    void clear(); // 清除所有元素

    1.1、添加基本属性

    基本属性包括:

    1、存储数据的数组

    2、元素的数量

    3、构造函数(默认数组大小)

    public class ArrrayList<E> {
        /**
         * ############################基本属性 ############################
         * */
        //存储数据的数组
        private E[] elements ;
    
        //元素的数量
        private int size ;
    
        //数组的默认容量
        private static final int DEAULT_CAPACITY = 10;
    
        /**
         * ############################构造函数 ############################
         * */
        public ArrrayList(int capacity) {
            elements = (E[]) new Object[capacity];
        }
    
        public ArrrayList() {
            this(DEAULT_CAPACITY);
        }
    
    }

    1.2、实现方法内容1

    先实现比较简单的方法

    /**
     * 获取元素的数量
     * */
    public int size(){
        return size;
    }
    // 是否为空
    public boolean isEmpty(){
        return size == 0;
    }
    // 是否包含某个元素
    public boolean contains(E element){
        for (int i=0;i<size ; i++){
            if (elements[i].equals(element)) return true;
        }
        return false;
    }
    // 清除所有元素
    public void clear(){
        for (int i=0;i<size;i++){
            elements[i] = null ;
        }
        size = 0 ;
    }

    1.3、编写根据下标获取元素的方法

    // 返回index位置对应的元素
    public E get(int index){
        rangeCheck(index);
        return elements[index];
    }
    //检查是否数组下标越界的问题
    public void rangeCheck(int index){
        if(index < 0 || index >= size){
            throw new ArrayIndexOutOfBoundsException();
        }
    }

    1.4、编写移除元素的操作

    移除元素需要达到的效果:

    比如现在要删除位置3的值:112

    那么删除后的效果应该是:

    代码实现

    // 删除index位置对应的元素,并返回删除的元素
    public E remove(int index){
        rangeCheck(index);
        E oldElements = elements[index];
        for (int i=index+1 ;i<size;i++){
            elements[i-1] = elements[i];
        }
        elements[--size] = null;
        return oldElements;
    }

    1.5、实现set操作

    大概实现的样子

     代码:

    // 设置index位置的元素,返回原来index位置的值
    public E set(int index, E element){
        rangeCheck(index);
        E oldElements = elements[index];
        elements[index] = element;
        return oldElements;
    }

    1.6、查看元素的位置

    实现效果

     代码:

    private static final int DEFAULT_NOT_FOUND = -1;
    // 查看元素的位置
    public int indexOf(E element){
        for (int i=0;i<size;i++){
            if (elements[i].equals(element)){
                return i;
            }
        }
        return DEFAULT_NOT_FOUND ;
    }

    1.7、在指定位置添加元素操作

    步骤

     代码

    // 在指定位置添加元素
    public void add(int index, E element){
        rangeCheckAdd(index);
        for(int i=size;i>index;i--){
            elements[i] = elements[i-1];
        }
        elements[index] = element ;
        size ++ ;
    
    }

    1.8、数组扩容操作

    原有数组长度是10,现在要添加11个元素,那么此时数组就面临着扩容的需求

    先自定义一个扩容因子,比如1.5倍

    那么当数组容量不够的时候,就扩容DEAULT_CAPACITY = DEAULT_CAPACITY + DEAULT_CAPACITY >> 1

    步骤:

    扩容代码:

    public void ensureCapacity(int capacity){
        int oldCapacity = elements.length;
        if (oldCapacity >= capacity) return ;
        //新数组容量
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //创建新数组
        E[] newElements = (E[])new Object[newCapacity];
        //将老数组的内容顺序添加到新数组
        for (int i=0;i<size;i++){
            newElements[i] = elements[i];
        }
        //然后将数组指针,指向新数组
        elements = newElements ;
        
    }

    然后在原有的add方法中添加ensureCapacity(size+1);

    最后,add方法代码:

     

    // 添加元素到最后面
    public void add(E element){
        add(size , element);
    }
    
    // 在指定位置添加元素
    public void add(int index, E element){
        rangeCheckAdd(index);
        ensureCapacity(size+1);
        for(int i=size;i>index;i--){
            elements[i] = elements[i-1];
        }
        elements[index] = element ;
        size ++ ;
    
    }

    1.9、编写测试

    public static void main(String[] args) {
        ArrrayList arrrayList = new ArrrayList();
        arrrayList.add(11);
        arrrayList.add(12);
        arrrayList.add(13);
        arrrayList.add(14);
        arrrayList.add(15);
        System.out.println(arrrayList);
        System.out.println("=================华丽的分隔符======================");
        arrrayList.set(1 , 22);
        System.out.println(arrrayList);
        System.out.println("=================华丽的分隔符======================");
        final boolean contains = arrrayList.contains(13);
        System.out.println("是否存在这个元素 :"+contains);
        System.out.println("=================华丽的分隔符======================");
        arrrayList.add(2 , 33);
        System.out.println(arrrayList);
        System.out.println("=================华丽的分隔符======================");
    
        System.out.println("位置2的元素值 :"+arrrayList.get(2));
    
        System.out.println("=================华丽的分隔符======================");
    
        System.out.println("22的位置:"+arrrayList.indexOf(22));
        System.out.println("=================华丽的分隔符======================");
    
        arrrayList.clear();
        System.out.println(arrrayList);
    
    }

    全部代码:

    package dynamicArray;
    
    import java.util.Arrays;
    
    /**
     * Created by angel
     */
    public class ArrrayList<E> {
        /**
         * ############################基本属性 ############################
         * */
        //存储数据的数组
        private E[] elements ;
    
        //元素的数量
        private int size ;
    
        //数组的默认容量
        private static final int DEAULT_CAPACITY = 10;
    
        /**
         * ############################构造函数 ############################
         * */
        public ArrrayList(int capacity) {
            elements = (E[]) new Object[capacity];
        }
    
        public ArrrayList() {
            this(DEAULT_CAPACITY);
        }
        /**
         * 获取元素的数量
         * */
        public int size(){
            return size;
        }
        // 是否为空
        public boolean isEmpty(){
            return size == 0;
        }
        // 是否包含某个元素
        public boolean contains(E element){
            for (int i=0;i<size ; i++){
                if (elements[i].equals(element)) return true;
            }
            return false;
        }
        // 清除所有元素
        public void clear(){
            for (int i=0;i<size;i++){
                elements[i] = null ;
            }
            size = 0 ;
        }
    
        // 返回index位置对应的元素
        public E get(int index){
            rangeCheck(index);
            return elements[index];
        }
        //检查是否数组下标越界的问题
        public void rangeCheck(int index){
            if(index < 0 || index >= size){
                throw new ArrayIndexOutOfBoundsException();
            }
        }
        // 删除index位置对应的元素,并返回删除的元素
        public E remove(int index){
            rangeCheck(index);
            E oldElements = elements[index];
            for (int i=index+1 ;i<size;i++){
                elements[i-1] = elements[i];
            }
            elements[--size] = null;
            return oldElements;
        }
        // 设置index位置的元素,返回原来index位置的值
        public E set(int index, E element){
            rangeCheck(index);
            E oldElements = elements[index];
            elements[index] = element;
            return oldElements;
        }
    
        private static final int DEFAULT_NOT_FOUND = -1;
        // 查看元素的位置
        public int indexOf(E element){
            for (int i=0;i<size;i++){
                if (elements[i].equals(element)){
                    return i;
                }
            }
            return DEFAULT_NOT_FOUND ;
        }
    
        // 添加元素到最后面
        public void add(E element){
            add(size , element);
        }
    
        // 在指定位置添加元素
        public void add(int index, E element){
            rangeCheckAdd(index);
            ensureCapacity(size+1);
            for(int i=size;i>index;i--){
                elements[i] = elements[i-1];
            }
            elements[index] = element ;
            size ++ ;
    
        }
    
        public void rangeCheckAdd(int index){
            if(index < 0 || index > size){
                throw new ArrayIndexOutOfBoundsException();
            }
        }
    
        public void ensureCapacity(int capacity){
            int oldCapacity = elements.length;
            if (oldCapacity >= capacity) return ;
            //新数组容量
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            //创建新数组
            E[] newElements = (E[])new Object[newCapacity];
            //将老数组的内容顺序添加到新数组
            for (int i=0;i<size;i++){
                newElements[i] = elements[i];
            }
            //然后将数组指针,指向新数组
            elements = newElements ;
    
        }
    
        @Override
        public String toString() {
            return "ArrrayList{" +
                    "elements=" + Arrays.toString(elements) +
                    ", size=" + size +
                    '}';
        }
    
        public static void main(String[] args) {
            ArrrayList arrrayList = new ArrrayList();
            arrrayList.add(11);
            arrrayList.add(12);
            arrrayList.add(13);
            arrrayList.add(14);
            arrrayList.add(15);
            System.out.println(arrrayList);
            System.out.println("=================华丽的分隔符======================");
            arrrayList.set(1 , 22);
            System.out.println(arrrayList);
            System.out.println("=================华丽的分隔符======================");
            final boolean contains = arrrayList.contains(13);
            System.out.println("是否存在这个元素 :"+contains);
            System.out.println("=================华丽的分隔符======================");
            arrrayList.add(2 , 33);
            System.out.println(arrrayList);
            System.out.println("=================华丽的分隔符======================");
    
            System.out.println("位置2的元素值 :"+arrrayList.get(2));
    
            System.out.println("=================华丽的分隔符======================");
    
            System.out.println("22的位置:"+arrrayList.indexOf(22));
            System.out.println("=================华丽的分隔符======================");
    
            arrrayList.clear();
            System.out.println(arrrayList);
    
        }
    
    
    }
    全部代码
  • 相关阅读:
    Java中容器的两种初始化方式比较
    java8之stream
    java8之lambda表达式入门
    java8之lambda表达式(1)-基本语法
    java中Comparable和Comparator两种比较器的区别
    将博客搬至CSDN
    vsphere6.5 创建数据中心、集群和添加主机
    VMware-VCSA-6.5安装过程
    docker--数据卷与数据卷容器
    docker私有库搭建过程(Registry)
  • 原文地址:https://www.cnblogs.com/niutao/p/12800877.html
Copyright © 2011-2022 走看看