一个数据结构必须具有以下基本功能:
①、如何插入一条新的数据项
②、如何寻找某一特定的数据项
③、如何删除某一特定的数据项
④、如何迭代的访问各个数据项,以便进行显示或其他操作
1 package array; 2 3 public class MyArray { 4 //定义一个数组 5 private int[] array; 6 //定义实际有效长度 7 private int elems; 8 //定义最长长度 9 private int length; 10 11 //默认长度为50的构造器 12 public MyArray(){ 13 elems=0; 14 length=50; 15 array=new int[length]; 16 } 17 18 //有参构造器 19 public MyArray(int length){ 20 elems=0; 21 this.length=length; 22 array=new int[length]; 23 } 24 25 //获取数组的有效长度 26 public int getElems() { 27 return elems; 28 } 29 30 //遍历数组 31 public void display(){ 32 for (int i=0;i<elems;i++){ 33 System.out.print(array[i]+" ");//这个循环不换行 34 } 35 System.out.println(); 36 } 37 38 //添加元素 39 public boolean add(int value){ 40 if (elems==length){ //数组下标从零开始算 下标是elems刚好超出 41 return false; 42 }else { 43 array[elems]=value; 44 elems++; 45 } 46 return true; 47 } 48 49 //根据下标获取元素 50 public int get(int i){ 51 if (i<0||i>elems){ 52 System.out.println("访问下标越界"); 53 } 54 return array[i]; 55 } 56 57 //查找元素 58 public int find(int searchValue){ 59 int i; 60 for (i=0;i<elems;i++){ 61 if (array[i]==searchValue){ 62 break; 63 } 64 } 65 if (i==elems){ 66 return -1; 67 } 68 return i; 69 } 70 71 //删除元素 72 public boolean delete(int value){ 73 int j = find(value); 74 if (j==-1){ //找不到删除元素 75 return false; 76 }else { 77 if (j==elems-1){ //删除元素在最高位 78 elems--; 79 }else { 80 for (int i=j;i<elems-1;i++){ //后一位元素顶替前一位,从删除元素开始 81 array[i]=array[i+1]; 82 } 83 elems--; 84 } 85 return true; 86 } 87 } 88 89 //修改元素 90 public boolean modify(int newValue,int oldValue){ 91 int i = find(oldValue); 92 if (i==-1){ 93 System.out.println("需要修改的元素不存在"); 94 return false; 95 }else { 96 array[i]=newValue; 97 return true; 98 } 99 } 100 101 102 }
测试:
1 package array; 2 3 public class Test { 4 public static void main(String[] args) { 5 //自定义长度为5的数组,不初始化默认为50 6 MyArray array = new MyArray(5); 7 //添加数组 8 array.add(666); 9 array.add(233); 10 array.add(110); 11 array.add(46); 12 array.add(38); 13 //遍历数组 14 array.display(); 15 16 //获取下标为零的元素 17 System.out.println(array.get(0)); 18 19 //删除元素38 20 array.delete(233); 21 array.display(); 22 23 //修改元素46为250 24 array.modify(119,110); 25 array.display(); 26 } 27 }
数组的局限性分析:
①、插入快,对于无序数组,上面我们实现的数组就是无序的,即元素没有按照从大到小或者某个特定的顺序排列,只是按照插入的顺序排列。无序数组增加一个元素很简单,只需要在数组末尾添加元素即可,但是有序数组却不一定了,它需要在指定的位置插入。
②、查找慢,当然如果根据下标来查找是很快的。但是通常我们都是根据元素值来查找,给定一个元素值,对于无序数组,我们需要从数组第一个元素开始遍历,直到找到那个元素。有序数组通过特定的算法查找的速度会比无需数组快,后面我们会讲各种排序算法。
③、删除慢,根据元素值删除,我们要先找到该元素所处的位置,然后将元素后面的值整体向前面移动一个位置。也需要比较多的时间。
④、数组一旦创建后,大小就固定了,不能动态扩展数组的元素个数。如果初始化你给一个很大的数组大小,那会白白浪费内存空间,如果给小了,后面数据个数增加了又添加不进去了。