一个数据结构必须具有以下基本功能:

①、如何插入一条新的数据项

②、如何寻找某一特定的数据项

③、如何删除某一特定的数据项

④、如何迭代的访问各个数据项,以便进行显示或其他操作

  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 }

 

数组的局限性分析:

  ①、插入快,对于无序数组,上面我们实现的数组就是无序的,即元素没有按照从大到小或者某个特定的顺序排列,只是按照插入的顺序排列。无序数组增加一个元素很简单,只需要在数组末尾添加元素即可,但是有序数组却不一定了,它需要在指定的位置插入。

  ②、查找慢,当然如果根据下标来查找是很快的。但是通常我们都是根据元素值来查找,给定一个元素值,对于无序数组,我们需要从数组第一个元素开始遍历,直到找到那个元素。有序数组通过特定的算法查找的速度会比无需数组快,后面我们会讲各种排序算法。

  ③、删除慢,根据元素值删除,我们要先找到该元素所处的位置,然后将元素后面的值整体向前面移动一个位置。也需要比较多的时间。

  ④、数组一旦创建后,大小就固定了,不能动态扩展数组的元素个数。如果初始化你给一个很大的数组大小,那会白白浪费内存空间,如果给小了,后面数据个数增加了又添加不进去了。

posted on 2018-08-21 22:08  蓝绿绿  阅读(119)  评论(0编辑  收藏  举报