【数据结构】 List 简单实现
public class XList<T> : IEnumerable, IEnumerator
{
#region List 简单实现 /// <summary>
/// 存储数据 数组
/// </summary>
private T[] _items; /// <summary>
/// 默认容量
/// </summary>
private const int DefaultLength = 4; /// <summary>
/// 插入最后一个元素索引(初始化时没有元素,所以为 -1)
/// </summary>
private int _lastIndex = -1; /// <summary>
/// 无参构造
/// </summary>
public XList()
{
_items = new T[DefaultLength];
} /// <summary>
/// 带初始容量的构造
/// </summary>
/// <param name="length"></param>
public XList(int length)
{
if (length <= 0)
{
throw new Exception("长度必须大于0");
}
_items = new T[length];
} /// <summary>
/// 索引器
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public T this[int index]
{
get
{
CheckIndex(index); // 验证索引越界
return _items[index];
}
set { Insert(index, value); }
} /// <summary>
/// 添加元素
/// </summary>
/// <param name="t"></param>
public void Add(T t)
{
Insert(_lastIndex + 1, t);
} /// <summary>
/// 插入元素
/// </summary>
/// <param name="index"></param>
/// <param name="t"></param>
public void Insert(int index, T t)
{
if (index < 0)
{
throw new Exception("索引不能小于0");
}
KeepCapacity();
if (index <= _lastIndex) // 插入位置已有元素
{
T[] temp = new T[Capacity];
for (int i = 0; i < index; i++)
{
temp[i] = _items[i];
}
temp[index] = t;
for (int i = index; i <= _lastIndex; i++)
{
temp[i + 1] = _items[i];
}
_items = temp;
_lastIndex++;
}
else if (index == _lastIndex + 1) // 在末尾插入
{
_items[++_lastIndex] = t;
}
else
{
throw new Exception("索引越界");
}
} /// <summary>
/// 按 索引 移除元素
/// </summary>
/// <param name="index"></param>
public void Remove(int index)
{
CheckIndex(index);
if (index != _lastIndex) // 移除元素不是最后一个元素
{
T[] temp = _items;
for (int i = index; i < _lastIndex; i++)
{
temp[i] = _items[i + 1];
}
_items = temp;
}
// 移除元素是最后一个元素,不做处理
_lastIndex--;
} /// <summary>
/// 集合存储元素数量
/// </summary>
/// <returns></returns>
public int Count()
{
return _lastIndex + 1;
} /// <summary>
/// 清空集合
/// </summary>
public void Clear()
{
_lastIndex = -1;
} /// <summary>
/// 集合 容量
/// </summary>
private int Capacity
{
get
{
if (_items != null)
{
return _items.Length;
}
return -1;
}
} /// <summary>
/// 保证容量充足,如果数组容量不够就重置大小,容量扩大一倍
/// </summary>
private void KeepCapacity()
{
if (Capacity == -1) // 数组为 null 的情况
{
_items = new T[DefaultLength];
return;
}
if (_lastIndex < Capacity - 1) // 容量足够
{
return;
}
// 容量不够
int length = Capacity * 2;
T[] temp = new T[length];
for (int i = 0; i < this.Capacity; i++)
{
temp[i] = _items[i];
}
_items = temp;
} /// <summary>
/// 检查索引越界的情况
/// </summary>
/// <param name="index"></param>
private void CheckIndex(int index)
{
if (index > _lastIndex)
{
throw new Exception("索引越界");
}
} #endregion #region 实现枚举 #region IEnumerable 成员 public IEnumerator GetEnumerator()
{
return this;
} #endregion #region IEnumerator 成员 private int _position = -1; public object Current
{
get { return _items[_position]; }
} public bool MoveNext()
{
if (_position < _lastIndex)
{
_position++;
return true;
}
return false;
} public void Reset()
{
_position = -1;
} #endregion #endregion
}
算是比较简单的 List 的实现,暂时先这样,有些地方还得完善,
知识点 : 索引器,枚举器,其他的都比较简单
【数据结构】 List 简单实现的更多相关文章
- 堆数据结构(heapq)简单应用
## 堆数据结构(heapq)简单应用 # 堆数据结构 heapq # 常用方法:nlargest(),nsmallest(),heapify(),heappop() # 如果需要的个数较小,使用nl ...
- Redis数据结构之简单动态字符串SDS
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...
- 单链表数据结构 - java简单实现
链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点.每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值.如图就是一个单向链表 一个单向链 ...
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
- 【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较
二分法查找: 『在有序数组的基础上通过折半方法不断缩小查找范围,直至命中或者查询失败.』 二分法的存储要求:要求顺序存储,以便于根据下标随机访问 二分法的时间效率:O(Log(n)) 二分 ...
- C语言数据结构之 简单选择排序
算法:设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-1趟 后就完成了记录序列的排序. 编译器: ...
- Java数据结构系列——简单排序:泡、选择、直接进入
package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中.小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序 ...
- (hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数<=3,输出剩下的人 )
题目: 士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- redis 系列3 数据结构之简单动态字符串 SDS
一. SDS概述 Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默 ...
- OI数据结构&&分治 简单学习笔记
持续更新!!! [例题]简单题(K-D tree) 题目链接 线段树 [例题](环上最大连续和) 给定一个长度为n的环形序列A,其中A1与A_n是相临的,现在有q次修改操作,每次操作会更改其中一个数, ...
随机推荐
- 关于Unix哲学
http://www.ruanyifeng.com/blog/2009/06/unix_philosophy.html 这几天,我在看Unix,发现很多人在谈"Unix哲学",也就 ...
- BZOJ3053:The Closest M Points(K-D Teee)
Description The course of Software Design and Development Practice is objectionable. ZLC is facing a ...
- SpringMVC学习记录三——8 springmvc和mybatis整合
8 springmvc和mybatis整合 8.1 需求 使用springmvc和mybatis完成商品列表查询. 8.2 整合思路 springmvc+mybaits的 ...
- java随机数Reandom(简单介绍)
简单介绍 Java中存在着两种Random函数 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0, ...
- MVC学习二:Controller和View关系
控制器(Controller)主要是定义方法和加载视图(View) 1.控制器中的Action方法返回值的类型ActionResult,string 2.控制器中Action方法接收浏览器参数方式: ...
- Android学习笔记_1_拨打电话
1.首先需要在AndroidManifest.xml文件中加入拨打电话的权限,对应的配置文件: <?xml version="1.0" encoding="utf- ...
- JavaScript js调用堆栈(三)
本文主要深入介绍JavaScript内存机制 内存模型 JS内存空间分为栈(stack),堆(heap),池(一般也会归类为栈中),其中栈存放变量,堆存放复杂对象,池存放常量. 注:闭包中的变量并不保 ...
- 上传文件,经过Zuul,中文文件名乱码解决办法
转载请标明出处: http://blog.csdn.net/forezp/article/details/77170470 本文出自方志朋的博客 问题描述 在项目中又一个上传文件的oss服务,直接调用 ...
- idea开启自动编译
springboot+thymeleaf+idea idea默认是不自动编译的. 首先热部署的jar包肯定是要加进去的 2,快捷键 ctrl+shift+alt+/ 点击registr ...
- c# 分析SQL语句中的表操作
最近写了很多方向的总结和demo.基本包含了工作中的很多方面,毕竟c#已经高度封装并且提供了很多类库.前面已经总结了博文.最近2天突然感觉前面的SQL分析阻组件的确麻烦,也注意看了下.为了方便大家学习 ...