不要小瞧数组(用静态数组实现我们自己的动态数组)
Posted zhixiangshu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不要小瞧数组(用静态数组实现我们自己的动态数组)相关的知识,希望对你有一定的参考价值。
(希望我所描述的一切,给你带来收获!)
我们将要使用的是JAVA中的静态数组——E[] data = new E[]();去实现一个属于我们自己的动态数组
第一步:(关于泛型不作过多解释)
1 public class Array<E> { 2 private E[] data; 3 private int size; 4 }
data是我们需要的数组,size是我们需要维护的动态数组的长度;size可以认为是数组的索引号,size总是指向数据的末端——当整个数组为空时size指向的是 data[0] 的位置,当数组只有 data[0] 一个元素时,size指向的数据末端是 data[1];也就是说,size总是指向用户数据(用户添加的数据)的后一个位置。
第二步:
1 /** 2 * 3 * @param capacity 4 */ 5 public Array(int capacity) { 6 data = (E[]) new Object[capacity]; 7 }
我们申请一个容量为capacity的数组,注意!java中不能直接对泛型进行new的操作,但Object是所有类的父类,通过new一个Object再进行类型强转是行得通的!但是,有时我们并不确定我们所需要多少大小的capacity,为了方便,我们还需要一个无参构造函数,初始化一个默认的capacity数组(默认的capacity我给的是10)
1 /** 2 * the default capacity is 10 3 */ 4 public Array() { 5 this(10); 6 }
第三步:实现一些简单的操作,例如:获取当前数组的长度、判断数组是否为空......
1 /** 2 *@return the current data length of the array 3 */ 4 public int getSize() { 5 return size; 6 } 7 8 /** 9 * Determines whether the array is empty 10 * @return false or true 11 */ 12 public boolean isEmpty() { 13 return size == 0; 14 } 15 16 /** 17 * get the Array capacity 18 * @return Array capacity 19 */ 20 public int capacity() { 21 return data.length; 22 }
我们一定要明确的一点是:用户只能看到size长度的data(这是外界给予可能是有价值意义的数据),而data.length则只是能承载多少用户数据的边界(限度)
第四步:为我们的Array<E>实现增加元素的操作add(int index,E e)方法
1 /** 2 * Insert an element on an index 3 * @param index 4 * @param e 5 */ 6 public void add(int index,E e) { 7 if (index < 0 || index > size) 8 throw new IllegalArgumentException("Add failed.Array is full"); 9 for (int i = size - 1; i >= index; i--) { 10 data[i+1] = data[i]; 11 } 12 data[index] = e; 13 size++; 14 }
需要注意的是,用户指定位置插入元素,index值一定要具有合法性——即index属于[0,size]
循环体中,data[i+1] = data[i]的语义是明显的——前一个元素向后一个元素移动。最初的移动在Array的尾部,即是 size - 1 的位置
第五步:移除Array中首个e元素(待更........)
以上是关于不要小瞧数组(用静态数组实现我们自己的动态数组)的主要内容,如果未能解决你的问题,请参考以下文章