A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、用类封装数组实现数据结构

ps:假设操作人是不会添加重复元素的,这里没有考虑重复元素,如果添加重复元素了,后面的查找,删除,修改等操作只会对第一次出现的元素有效。

package com.lwl.array;
/**
*     
* @author liuweilong
*
*/
public class MyArray {
       //定义一个数组
       private int [] intArray;
       //定义数组的实际有效长度
       private int elems;
       //定义数组的最大长度
       private int length;

      //默认构造一个长度为50的数组
      public MyArray(){
          elems = 0;
          length = 50;
          intArray = new int[length];
      }
      //构造函数,初始化一个长度为length 的数组
      public MyArray(int length){
          elems = 0;
          this.length = length;
          intArray = new int[length];
      }

      //获取数组的有效长度
      public int getSize(){
          return elems;
      }

      /**
       * 遍历显示元素
       */
      public void display(){
          for(int i=0;i<elems;i++){
              System.out.println(intArray[i]+" ");
          }
      }

      /**
       * 添加元素
       * @param value,假设操作人是不会添加重复元素的,如果有重复元素对于后面的操作都会有影响。
       * @return添加成功返回true,添加的元素超过范围了返回false
       */
      public boolean add(int value){
          if(elems==length){
              return false;
          }else{
              intArray[elems]=value;
              elems++;
           }
             return true;
         }

      /**
       * 根据下标获取元素
       * @param i
       * @return查找下标值在数组下标有效范围内,返回下标所表示的元素
       * 查找下标超出数组下标有效值,提示访问下标越界
       */
      public int get(int i){
         if(i<0 || i>length){
             System.out.println("数组下标越界");
         }
             return intArray[i];
      }
      /**
       * 查找元素
       * @param searchValue
       * @return查找的元素如果存在则返回下标值,如果不存在,返回 -1
       */
      public int find(int searchValue){
          int i;
         for( i=0;i<elems;i++){
             if(intArray[i] == searchValue){
                 break;
             }
         }
         if(i == elems){
             return -1;
         }

         return i;
      }
      /**
       * 删除元素
       * @param value
       * @return如果要删除的值不存在,直接返回 false;否则返回true,删除成功
       */
      public boolean delete(int value){
            int k=find(value);//查找位置下标
            if(k==-1){    //找不到即返回false
                return false;
            }else{
                if(k==elems-1){ //删除值为数组最后一位,只需数组大小减一即可
                    elems--;
                }else{
                    for(int i=k;i<elems-1;i++){//删除位置为数组中,后一位数据赋值给前一位

                       intArray[i]=intArray[i+1];
                    }
                    elems--;
                }
                return true;
            }
      }

     /**
      * 修改数据
      * @param oldValue原值
      * @param newValue新值
      * @return修改成功返回true,修改失败返回false
      */
     public boolean modify(int oldValue,int newValue){
       int k= find(oldValue);
       if(k==-1){
          System.out.println("所修改的数据不存在");
          return false;
        }else{
         intArray[k]=newValue;
          return true;
         }
       }


}  
二、数组的局限性分析:

①、插入快,对于无序数组,上面我们实现的数组就是无序的,即元素没有按照从大到小或者某个特定的顺序排列,只是按照插入的顺序排列。无序数组增加一个元素很简单,只需要在数组末尾添加元素即可,但是有序数组却不一定了,它需要在指定的位置插入。
②、查找慢,当然如果根据下标来查找是很快的。但是通常我们都是根据元素值来查找,给定一个元素值,对于无序数组,我们需要从数组第一个元素开始遍历,直到找到那个元素。有序数组通过特定的算法查找的速度会比无需数组快,后面我们会讲各种排序算法。
③、删除慢,根据元素值删除,我们要先找到该元素所处的位置,然后将元素后面的值整体向前面移动一个位置。也需要比较多的时间。
④、数组一旦创建后,大小就固定了,不能动态扩展数组的元素个数。如果初始化你给一个很大的数组大小,那会白白浪费内存空间,如果给小了,后面数据个数增加了又添加不进去了。
很显然,数组虽然插入快,但是查找和删除都比较慢,而且扩展性差,所以我们一般不会用数组来存储数据,那有没有什么数据结构插入、查找、删除都很快,而且还能动态扩展存储个数大小呢,答案是有的,但是这是建立在很复杂的算法基础上,后面我们也会详细讲解。

4 个回复

正序浏览
月夜月 来自手机 初级黑马 2019-4-29 13:34:25
报纸
???为什么屏蔽了
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
奈斯,很赞
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马