欢迎光临
我们一直在努力

算法与数据结构-C#从零构建动态数组

1.为了彻底理解动态数组List<>和ArrayList的特性,基于静态数组制作一个动态数组

2.首先创建一个泛型类

internal class Array1<E>
{
private E[] data;//私有的E类型的数组
private int N;//私有的N记录实例存储数据
}

3.给这个类添加构造方法,在创建自己的动态数组时,可以设置数组的默认大小,也可以不设置

public Array1(int capacity)
{
data=new E[capacity];//新建容量大小
N = 0;
}
public Array1() : this(10) { }//默认10个

4.添加Add方法,用于增加动态数组的元素

public void Add(int index, E e) {
if (index < 0 || index > N) { throw new ArgumentException("超出限制"); }//判断索引是否正确
if(N==data.Length) { ResetCapacity(data.Length * 2); }//扩容
for(int i=N-1;i>=index;i–) //从最后一个元素开始,逐次往后移动,直到将新增的元素填到索引中
{
data[i + 1] = data[i];

}
data[index] = e;
N++;//数组的元素数量加一
}

5.添加Remove方法,将需要删除的元素索引,从后一个进行覆盖

public void Remove(int index)
{
if (index < 0 || index >= N) { throw new ArgumentException("超出限制"); }
for (int i = index; i < N-1; i++)
{
data[i]= data[i+1];

}

if (N <= data.Length / 4)//如果储存的元素小于数组容量的四分之一,则进行缩容
{
ResetCapacity(data.Length / 2);
}
data[N – 1] = default(E);//最后一位空缺的元素赋默认值
N–;//数组的元素数量减一
}

6.新建刷新容量方法,新建一个新的数组,方法参数为新的数组的容量大小,将旧数组的元素依次复制到新的数组中

public void ResetCapacity(int newCapacity)//新建新的数组,将旧数组元素复制到新数组元素中
{
E[] newDate=new E[newCapacity];
for (int i = 0; i < N; i++)
{
newDate[i] = data[i];
}
data = newDate;
}

7.新建两个只读属性,用于向外输出数组的大小和数组记录元素的数量

public int Capacity { get { return data.Length; } }
public int Count { get { return N; } }

8.重写一个ToString方法,用于自定义的输出数组,可以形象的展示数组内部的大小,具体元素等

public override string ToString () {
StringBuilder sb=new StringBuilder();//使用StringBuilder类来组合字符串
sb.Append($"capacity:{Capacity},count:{N}");
sb.Append('[');
for (int i = 0; i < N; i++)
{
sb.Append(data[i]);
sb.Append(", ");
}
sb.Append("]");
return sb.ToString ();

9.新增一些其它的方法,都是基于以上几个基本的方法

public bool IsEmpty { get { return N == 0; } }
public void TopAdd(E NewE)
{
Add(0, NewE);
}
public void TopRemove()
{
Remove(0);
}
public void EndAdd(E NewE)
{
Add(N, NewE);
}
public void EndRemove()
{
Remove(N-1);
}
public bool Contains(E value)
{
for (int i = 0; i < N; i++)
{
if (data[i].Equals(value)) return true;
}
return false;
}
public int Indexof(E value)
{
for (int i = 0; i < N; i++)
{
if (data[i].Equals(value)) return i;
}
return -1;

}
public E GetValue(int index)
{
if (index < 0 || index > N) { throw new ArgumentException("超出限制"); }
return data[index];
}

在main函数中使用这个自定义的动态数组类,可以实现List<T>的部分功能

static void Main(string[] args)
{

Array1<string> a = new Array1<string>();
for(int i = 0;i<11;i++) { a.Add(i, i.ToString()); }
Console.WriteLine(a.ToString());

Console.WriteLine(a.Contains("11"));
a.Remove(5);
Console.WriteLine(a.ToString());

for (int i = 0; i < 9; i++)
{
a.Remove(0);
}
Console.WriteLine(a.ToString());
}

赞(0)
未经允许不得转载:171主机测评 » 算法与数据结构-C#从零构建动态数组
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址