01.线性表 ArrayList

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01.线性表 ArrayList相关的知识,希望对你有一定的参考价值。

技术分享
  1   public class MyArrayList
  2     {
  3         //容量
  4         private const int _defaultCapacity = 4;
  5         //存放数组元素
  6         private object[] _items;
  7         //数组大小
  8         private int _size;
  9         //元素个数为0的数组状态
 10         private static readonly object[] emptyArray = new object[0];
 11 
 12         public MyArrayList()
 13         {
 14             this._items = emptyArray;
 15         }
 16 
 17         public MyArrayList( int capacity)
 18         {
 19             if (capacity<0)
 20             {
 21                 throw new ArgumentOutOfRangeException("capacity","ArrayList的容量不可为负数!");
 22             }
 23             this._items = new object[capacity];
 24         }
 25 
 26         //索引器
 27         public virtual object this[int index]
 28         {
 29             get 
 30             {
 31                 if (index<0||index>=this._size)
 32                 {
 33                     throw new ArgumentOutOfRangeException("index","索引超出范围!");
 34                 }
 35                 return this._items[index];
 36             }
 37 
 38             set 
 39             {
 40                 if (index < 0 || index >= this._size)
 41                 {
 42                     throw new ArgumentOutOfRangeException("index", "索引超出范围!");
 43                 }
 44                 this._items[index] = value;
 45             }
 46 
 47         }
 48 
 49         //当前数组元素个数
 50         public virtual int Count
 51         {
 52             get {return this._size ;}
 53         }
 54 
 55         //数组的容量
 56         public virtual int Capacity
 57         {
 58             get { return this._items.Length; }
 59             set 
 60             {
 61                 if (value!=this._items.Length)
 62                 {
 63                     if (value<this._size)
 64                     {
 65                         throw new ArgumentOutOfRangeException("value","容量太小");
 66                     }
 67                     if (value > 0)
 68                     {//开辟新内存空间存储元素
 69                         object[] dest = new object[value];
 70                         if (this._size > 0)
 71                         {//搬动元素
 72                             Array.Copy(this._items, 0, dest, 0, this._size);
 73                         }
 74                         this._items = dest;
 75                     }
 76                     else//数组最小的空间为4
 77                     {
 78                         this._items=new object[_defaultCapacity]; 
 79                     } 
 80                 }
 81             }
 82         }
 83 
 84         //元素的添加
 85         public virtual int Add(object value)
 86         {//当空间已满
 87             if (this._size==this._items.Length)
 88             {
 89                 this.EnsureCapacity(this._size+1);
 90             }
 91             this._items[this._size] = value;
 92             return this._size++;
 93         }
 94 
 95         //扩容
 96         private void EnsureCapacity(int p)
 97         {
 98             if (this._items.Length<p)
 99             {//空间加倍
100                 int num = (this._items.Length == 0) ? _defaultCapacity : (this._items.Length * 2);
101                 if (num < p)
102                 {
103                     num = p;
104                 }
105                 this.Capacity = num;
106             } 
107         }
108 
109         //指定位置插入元素
110         public virtual void Insert( int index,object value)
111         {
112             if (index<0||index>this._size)
113             {
114                 throw new ArgumentOutOfRangeException("index","索引超出范围!");
115             }
116             if (this._size==this._items.Length)
117             {
118                 this.EnsureCapacity(this._size + 1);
119             }
120             if (index<this._size)
121             {
122                 Array.Copy(this._items, index, this._items, index + 1, this._size - index);
123             }
124             this._items[index] = value;
125             this._size++;
126         } 
127 
128         //移除指定索引的元素
129         public virtual void Remove(int index)
130         {
131             if (index < 0 || index > this._size)
132             {
133                 throw new ArgumentOutOfRangeException("index", "索引超出范围!");
134             }
135             this._size--;
136             if (index<this._size)
137             {
138                 Array.Copy(this._items,index+1,this._items,index,this._size-index);
139             }
140             this._items[this._size]=null; 
141         }
142 
143         //裁剪空间
144         public virtual void TrimToSize()
145         {
146             this.Capacity = this._size;
147         }
148     }
View Code

 

以上是关于01.线性表 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

java线性表之顺序表实现

[从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

从0开始手写ArrayList动态数组

顺序线性表 ---- ArrayList 源码解析及实现原理分析

线性表之何时使用ArrayListLinkedList?

从0开始手写ArrayList动态数组和LinkedList双向链表