首先在介绍如何自己创建一个集合之前,先介绍几个概念:数据结构、数据(data)、数据元素(Data Element)、数据项(Data Item)、数据对象(Data Object)、数据类型(Data Type)
1、数据结构:数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 这里的定义来自百度,其实你可以笼统的理解为数据和数据的关系, 根据数据元素之间关系的不同特性,通常由4类基本数据结构:集合结构、线性结构、树形结构、图状结构,而我们今天创建的集合就是属于线性结构,他的本质是一个数组,我们是通过顺序表来实现。
2、数据:这个好理解,就是计算机处理的各种数据,有数值数据:如整数,实数等;有非数值数据:如字符、、图像、声音等
3、数据元素:数据元素是数据的基本单位,在计算机程序中通常被当作整体来处理,可以由若干个数据项构成
4、数据项:数据项是不可分割的、含有独立意义的最小数据
5、数据对象:相同性质的数据元素的集合就是数据对象,例如,整数数据对象就{0,±1,±2,±3}
6、数据类型:数据类型是数据的取值范围和对数据进行操作的总和。数据类型规定了程序中对象的特性。如果:string(字符串类型)、char(字符类型)、int(整数类型)等等
了解了这几个概念之后,今天要做的就是使用线性表中的顺序表来创建一个和List集合功能大致相同的自定义集合。先介绍一下什么是顺序表:在计算机内,保存线性表最简单、最自然的方式,就是把表中的元素一个接一个地放进顺序的存储单元,这就是线性表的顺序存储(Sequence Storage)。线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,用这种方式存储的线性表叫顺序表(Sequence List)。
一、首先定义一个线性表接口:
前9个抽象函数比较好理解,List集合里也都包含这些方法,但是第10和11个我需要说一下,因为我们的顺序表是通过数组来实现的(其实List集合也是由数组实现的),所以这里的原始容器指的是就是数组
//线性表接口定义:线性表的实现有 顺序表、单链表{双向链表、循环链表}
interface IListDs
{
int GetLength();//1.求长度
void Clear();//2.清空操作
bool IsEmpty();//3.判断线性表是否为空
void Add(T item);//4.添加数据
void Insert(T item, int index);//5.插入数据
T Delete(int index);//6.删除数据
T GetElement(int index);/7./取数据
T this[int index] { get; }//8.索引器取数据
int Locate(T value);//9.按照值查找数据
int GetSize { get; }//10.获取原始容器的大小
T[] GetOriginalData { get; }//11.获取原始容器里的数据
}
二、创建一个类实现接口,以顺序表的方式实现
这里我们定义一个类,命名为SeqList 这就是我们自己定义的List,然后我们在类里声明一个存储数据的数组data,之前上面的两个获取原始容器指的就是这个数组。
///
/// 顺序表的实现
///
///
class SeqList : IListDs
{
private T[] data;//存储数据
private int count = 0;//表示存了多少数据(这个不是下标)
///
/// 构造方法,初始化线性表大小
///
///
public SeqList(int size)
{
data = new T[size];
count = 0;
}
///
/// 构造方法,默认线性表大小为10
///
public SeqList():this(10)
{
}
///
/// 根据索引取值
///
///
///
public T this[int index]
{
get { return GetElement(index); }
}
///
/// 添加元素
///
///
public void Add(T item)
{
if (count==data.Length)//当前数组已经满
{
T[] temp = data;
data = new T[data.Length*2];//扩容数组
for (int i = 0; i < temp.Length; i++)
{
data[i] = temp[i];//把之前数组的值赋给扩容后的数组
}
}
data[count] = item;
count++;
}
///
/// 清空线性表
///
public void Clear()
{
count = 0;
}
///
/// 根据索引删除元素
///
///
///
public T Delete(int index)
{
T temp = data[index];
if (indexcount-1)
{
Console.WriteLine("错误,索引超出线性表长度");
}
count--;
return temp;
}
///
/// 根据索引查找元素
///
///
///
public T GetElement(int index)
{
if(index>=0&&index
/// 获取线性表长度
///
///
public int GetLength()
{
return count;
}
///
/// 插入元素
///
///
///
public void Insert(T item, int index)
{
if(index= index; i--)
{
data[i + 1] = data[i];
}
data[index] = item;
count++;
}
else//索引超出长度,调用增加数据的方法
{
Add(item);
}
}
///
/// 判断线性表是否为空
///
///
public bool IsEmpty()
{
return count == 0;
}
///
/// 返回元素对应的索引值
///
///
///
public int Locate(T value)
{
for (int i = 0; i < count; i++)
{
if(data[i].Equals(value))
{
return i;//找到数据
}
}
return -1;//数据不存在
}
///
/// 获取容器的大小
///
///
public int GetSize
{
get { return data.Length; }
}
///
/// 获取原始数据的容器
///
public T[] GetOriginalData
{
get { return data; }
}
}
三、测试我们的数组
class Program
{
static void Main(string[] args)
{
//通过类名创建一个sting的类型的我们自己的存储数据的集合
SeqList myList = new SeqList();//默认容器大小是10
//测试一、添加元素
Console.WriteLine("测试一、添加元素");
for (int i = 0; i < 50; i++)//这里添加50个数据,看是否成功扩容
{
string temp = i.ToString();
myList.Add("字符串 " +temp);
}
for (int i = 0; i < myList.GetLength(); i++)
{
Console.WriteLine(myList[i]);
}
Console.WriteLine("容器大小:"+myList.GetSize);
Console.WriteLine("线性表长度:"+myList.GetLength());
//测试二、插入数据
Console.WriteLine("测试二、插入数据");
myList.Insert("我的上面是19,下面是20", 20);
myList.Insert("我的上面是5,下面是6", 6);
myList.Insert("我的上面是29,下面是30", 32);//表的长度已经增加2,所以下标要增加,才能满足
myList.Insert("下面是0", 0);
myList.Insert("我在最后", 70);//按照之前写的插入逻辑应该在最后
for (int i = 0; i < myList.GetLength(); i++)
{
Console.WriteLine(myList[i]);
}
Console.WriteLine("容器大小:" + myList.GetSize);
Console.WriteLine("线性表长度:" + myList.GetLength());
//测试三、清空线性表
myList.Clear();
Console.WriteLine("测试三、清空线性表");
Console.WriteLine("容器大小:" + myList.GetSize);
Console.WriteLine("线性表长度:" + myList.GetLength());
//测试四、获取原始表
Console.WriteLine("测试四、获取原始表");
for (int i = 0; i < myList.GetSize; i++)
{
Console.WriteLine("原始容器数据 " + myList.GetOriginalData[i]);
}
Console.ReadKey();
}
}
最后附上截图
这里最后还有一些 ,没截下来,但和上面是一样。
作完这个测试你会对数组和集合有更深刻的理解,可以自己试一下
分享让知识变得有意义!后续会继续更新一些学习中问题。
OJMars
InTheMars