基于数组实现线性表

  数组是一组内存地址连续的存储单元,所以用数组实现的线性表是顺序存储的。可以通过数组下标轻易的访问不同位置的数据,但要注意下标越界的异常(ArrayIndexOutOfBoundsException)

  用数组实现的线性表,查询与更改方法有着优势。(因为有下标)

  1.MyList接口定义功能

public interface MyList {
    //新增一个元素
    void add(Object element);
    //删除与输入元素相同的元素
    void delete(Object element);
    //根据索引删除元素
    void delete(int index);
    //更新元素
    void update(int index,Object newelement);
    //三种查询形式
    boolean contains(Object element);
    
    Object at(int index);
    
    int indexOf(Object element);
}

   2.MyArrayList类实现接口功能

  1 public class MyArrayList implements MyList{
  2     private Object elements[];//真正存储元素的底层结构
  3     private int size;//当前的存储个数
  4     private int capcity;//总容量
  5     
  6     public MyArrayList(int capcity)
  7     {
  8         this.size=0;
  9         this.capcity=capcity;
 10         elements=new Object[capcity];
 11     }
 12     public MyArrayList()
 13     {
 14         this(10);
 15     }
 16     @Override
 17     public void add(Object element) {
 18         if(size==capcity)//因为数组是不可变长的,所以需要进行特殊扩容
 19         {
 20             capcity=capcity*2;
 21             Object newElements[]=new Object[capcity];
 22             for(int i=0;i<size;i++)
 23             {
 24                 newElements[i]=elements[i];
 25             }
 26             elements=newElements;
 27         }
 28         elements[size++]=element;
 29         
 30     }
 31 
 32     @Override
 33     public void delete(Object element) {
 34         int index=indexOf(element);//调用本类的方法
 35         if(index>=0)
 36             delete(index);
 37         
 38         
 39     }
 40 
 41     @Override
 42     public void delete(int index) {
 43         //防复杂度的震荡
 44         if(size<=capcity/4&&!(capcity/4==0))
 45         {
 46             capcity=capcity/2;
 47             Object newElements[]=new Object[capcity];
 48             for(int i=0;i<size;i++)
 49             {
 50                 newElements[i]=elements[i];
 51             }
 52             elements=newElements;
 53         }
 54         if(size>0)//防止下标溢出
 55         {
 56             for(int i=index;i<size-1;i++) 
 57             {
 58                 elements[i]=elements[i+1];
 59             }
 60             elements[size-1]=null;
 61             size--;
 62         }
 63     }
 64 
 65     @Override
 66     public void update(int index, Object newelement) {
 67         elements[index]=newelement;
 68         
 69     }
 70 
 71     @Override
 72     public boolean contains(Object element) {
 73         return indexOf(element)>=0;
 74         
 75         
 76     }
 77 
 78     @Override
 79     public Object at(int index) {
 80         return elements[index];
 81     }
 82     
 83     
 84     @Override
 85     public int indexOf(Object element) {
 86         for(int i=0;i<size;i++)
 87         {
 88             //注意要用equals方法进行比较,因为类型为Object.
 89             if(element.equals(elements[i]))
 90                 return i;
 91         }
 92         return -1;
 93     }
 94     
 95     @Override
 96     public String toString()
 97     {
 98         //for循环对 字符的改变过多 需要使用可变字符串(减少对内存的消耗)
 99         StringBuilder sb=new StringBuilder("[");
100         for(int i=0;i<size;i++)
101         {
102             sb.append(elements[i]+(i<size-1?",":""));
103         }
104         sb.append("]");
105         return "MyArrayList{elements="+sb+"}"+"  capciyt:"+getCapcity()+"  size:"+getSize();
106     }
107     
108     
109     public int getSize() {
110         return size;
111     }
112     
113     public int getCapcity() {
114         return capcity;
115     }
116     
117     
118     
119 
120     
121 }

 

posted @ 2018-12-25 17:16  Spider&Man  阅读(915)  评论(0编辑  收藏  举报