




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 C 程序设计经典教程 第六章集合 索引器与泛型 1 总体要求了解 NET类库中的集合类 初步掌握常用集合的创建和操作方法 理解索引器的概念 能区别索引器与属性 掌握索引器的定义与使用 了解泛型的相关概念 初步掌握泛型接口 泛型类 泛型属性和泛型方法的使用 2 相关知识点熟悉类和数组的定义和使用 熟悉类的方法成员的定义与使用等基本操作 3 学习重点集合 索引器 泛型的定义与使用 4 学习难点索引器的作用 定义与使用方法泛型的概念和意义 泛型的定义和使用方法 第六章集合 索引器与泛型 第六章集合 索引器与泛型 主要内容6 1集合6 2索引器6 3泛型 6 1集合 6 1 1集合概述6 1 2ArrayList6 1 3哈希表Hashtable6 1 4栈和队列 6 1 1集合概述 集合能随意调整大小 集合可以把一组类似的对象组合在一起 任何类型的对象都可被组合到一个Object类型的集合中 并通过C 的foreach语句来访问其中的每一个对象 操作过程中MyClass的对象与Object对象之间MyClassmcObj 装箱 Objectobj mcObj 无需显式转换 拆箱 mcObj MyClass obj 事先装箱的 对象类型的集合位于System Collections命名空间 6 1数组类Array 数组是简单集合System Array类是所有数组的基类 特殊类 不能用于派生 publicabstractclassArray ICloneable IList 类体 实现了多个接口 数组操作的常用属性和方法 多为静态 interfaceICollection intCount get voidCopyTo Arrayarray intindex boolIsSynchronized get objectSynchRoot get interfaceICloneable objectClone interfaceIList Collection IEnumerable intAdd objdectvalue voidClear boolContains objectvalue intIndexOf objectvalue voidRemove objectkey voidRemoveAt intindex voidInsert intindex objectvalue interfaceIEnumerator ObjectCurrent get boolMoveNext voidReset interfaceIEnumerable foreach遍历的基础IEnumeratorGetenumerator publicstaticvoidMain int a newint 3 Arrayb Array CreateInstance typeof int 3 for inti 0 i 3 i a I 2 i b SetValue 3 i i foreach intxina console Write 0 x foreach intxinb console Write 0 x 接口中的方法 默认是publicabstract的 继承接口的类 必须实现接口中的所有属性和方法 否则该类是抽象的 6 1 4栈和队列 1 栈StackStack类实现了先进后出的数据结构 这种数据结构在插入或删除对象时 只能在栈顶插入或删除 创建栈对象的一般形式如下 Stack栈名 newStack Stack类提供了栈常用操作方法 包括在栈顶添加数据 移除栈顶数据 返回栈顶数据 清空栈和检查是否包含某个数据等 方法名分别为Push Pop Peek Clear和Contains 其中 Push和Pop每操作一次只能添加或删除一个数据 a1 a2 an 栈底 栈顶 出栈 进栈 6 1 4栈和队列 2 队列QueueQueue类实现了先进先出的数据结构 这种数据结构把对象放进一个等待队列中 当插入或删除对象时 对象从队列的一端插入 从另外一端移除 队列可以用于顺序处理对象 因此队列可以按照对象插入的顺序来存储 创建队列对象的一般形式如下 Queue队列名 newQueue 队列长度 增长因子 其中 队列长度默认为32 增长因子默认为2 0 即每当队列容量不足时 队列长度调整为原来的2倍 可重新设置增长因子的大小 a1a2a3 an 队头 队尾 出队 入队 10 集合类的选择 选择集合类时 一般要考虑以下问题 1 是否需要一个序列列表 需要先进先出行为时可使用Queue队列类 在需要后进先出行为时可使用Stack栈类 2 是否需要随机访问集合中的元素 此时不能选择Queue队列类 Stack栈类 LinkedList双向链表类 3 是否需要通过索引访问每个元素 只有ArrayList StringCollection等是从索引为零的元素开始逐个访问集合元素 Hashtable Dictionary通过元素的键 即元素名字 提供对元素的访问 而NameValueCollection类和SortedList泛型类通过其元素的从零开始的索引 或者通过其元素的键提供对元素的访问 4 是否包含一个值 一个键和一个值的集合 还是一个键和多个值的集合 其中 一个值 的集合是一种基于IList列表接口派生的集合 一个键和一个值 的集合是一种基于IDictionary字典接口的集合 一个键和多个值 的集合是NameValueCollection类 11 集合类的选择 续 5 是否需要用与输入元素方式不同的方式对元素排序 Hashtable按其元素的哈希代码对元素排序 SortedList以及SortedDictionary根据IComparer实现按键对元素的排序 而ArrayList提供Sort排序方法 6 是否需要信息的快速搜索和检索 对于小集合 10个元素或更少 ListDictionary比Hashtable快 SortedDictionary泛型类提供比Dictionary泛型类更快的查找 7 是否需要只接受字符串的集合 如StringCollection和StringDictionary等 12 三 集合的创建与操作 1 动态数组类ArrayList2 队列Queue3 栈Stack4 哈希表Hashtable5 字符串字典StringDictionary 1 动态数组类ArrayList ArrayList 可以看作是能够自动增长容量的动态数组 它实现了IList接口 1 Capacity集合容量 读写属性 2 Count获取列表中实际包含元素的个数 3 Add 方法 列表末尾添加元素 4 Insert 方法 列表指定位置添加元素 5 Remove 方法 移除特定对象 6 RemoveAt 方法 根据索引值移除对象 14 1 动态数组类ArrayList 1 ArrayList与Array的区别Array的大小是固定的 而ArrayList的大小可根据需要自动扩充 在Array中一次只能获取或设置一个元素的值 而在ArrayList中允许添加 插入或移除某一范围的元素 Array的下限可以自定义 而ArrayList的下限始终为零 Array可以具有多个维度 而ArrayList始终只是一维的 Array位于System命名空间中 ArrayList位于System Collections命名空间中 2 创建动态数组 ArrayList列表对象名 newArrayList 例如 ArrayListlist newArrayList list Add 罗福强 list Add 30 15 2 队列Queue 队列的特点一种先进先出的数据结构 当插入或删除对象时 对象从队列的一端插入 从另外一端移除创建队列对象Queue队列名 newQueue 队列长度 增长因子 说明 队列长度默认为32 增长因子默认为2 0 即每当队列容量不足时 队列长度调整为原来的2倍 注意 由于调整队列的大小需要付出一定的性能代价 因此建议在构造队列时指定队列的长度 队列包括Enqueue Dequeue Peek Clear和Contains等方法 其中 Enqueue和Dequeue每操作一次只能添加或删除一个数据 例如 Queueq newQueue 50 3 0 q Enqueue 董涛 q Enqueue 徐磊 16 3 栈Stack 栈的特点 一种先进后出的数据结构 这种数据结构在插入或删除对象时 只能在栈顶插入或删除 创建栈对象 Stack栈名 newStack 栈包括Push Pop Peek Clear和Contain等方法 其中 Push和Pop每操作一次只能添加或删除一个数据 例如 Stacks newStack s Push 成都 s Push 四川 17 4 哈希表Hashtable 哈希表又称散列表 表示键 值对的集合 哈希表的特点 在保存集合元素时 首先要根据键自动计算哈希代码 以确定该元素的保存位置 再把元素的值放入相应位置所指向的存储桶中 查找时 再次通过键所对应的哈希代码到特定存储桶中搜索 创建哈希表对象Hashtable哈希表名 newHashtable 哈希表长度 增长因子 说明 默认长度为0 默认增长因子为1 0哈希表包括Add Remove Clear和Contains等方法 其中 Add方法需要两个参数 一个是键 一个是值 Remove方法只需要一个键名参数 例如 Hashtableh newHashtable h Add 1001 李天军 h Add 1002 张凯 18 5 字符串字典StringDictionary 字符串字典StringDictionary是一种把键和值强类型化为字符串而不是对象的哈希表 其中 键不能为null 且不区分大小写 例如 StringDictionarymyCol newStringDictionary myCol Add 姓名 罗福强 myCol Add 性别 男 foreach DictionaryEntrydeinmyCol Console WriteLine 0 t 1 n de Key de Value 6 2索引器 6 2 1索引器的定义与使用6 2 2索引器与属性的比较 返回 2020 3 17 20 可编辑 6 2 1索引器的定义与使用 1 索引器的定义C 中的类成员可以是任意类型 包括数组或集合 当一个类包含了数组或集合成员时 索引器将大大简化对数组或集合成员的存取操作 6 2 1索引器的定义与使用 定义索引器的方式与定义属性有些类似 其一般形式如下 修饰符 数据类型this 索引类型index get 获得属性 set 设置属性 classAlbum 定义一个相册类 Photo photos 该数组用于存放照片publicPhotothis intindex 带有int参数的Photo读 写索引器 get if index photos Length returnnull returnphotos index 对于有效索引 返回请求的照片 set if index photos Length return photos index value 6 2 1索引器的定义与使用 2 索引器的使用通过索引器可以存取类的实例的数组成员 操作方法与数组相似 一般形式如下 对象名 索引 其中 索引的数据类型必须与索引器的索引类型相同 实例6 3 利用前面定义的索引器进行照片的添加和查询 6 2 1索引器的定义与使用 3 接口中的索引器在接口中也可以声明索引器 接口索引器与类索引器的区别有两个 一是接口索引器不使用修饰符 二是接口索引器只包含访问器get或set 没有实现语句 访问器的用途是指示索引器是可读写 只读还是只写的 如果是可读写的 访问器get和set均不能省略 如果是只读的 省略set访问器 如果是只写的 省略get访问器 例如 publicinterfaceIAddress stringthis intindex get set 声明索引器stringAddress get set 声明属性stringAnswer 声明方法 6 2 2索引器与属性的比较 索引器与属性都是类的成员 语法上非常类似 索引器一般用在自定义的集合类中 通过使用索引器来操作集合对象就如同使用数组一样简单 而属性可用于任何自定义类 它增强了类的字段成员的灵活性 6 3泛型 6 3 1泛型概述6 3 2泛型集合6 3 3泛型类 泛型方法和泛型接口 返回 27 1 什么是泛型 泛型是通过 参数化类型 来实现在同一则代码中操作多种数据类型 泛型类型是一种编程范式 它利用 参数化类型 将类抽象化 从而实现更为灵活的复用 泛型赋予了代码更强的安全性 更好的复用 更高的效率和更清晰的约束 6 3 泛型方法的例子 voidSwap refTt1 refTt2 Ttemp t1 t1 t2 t2 temp IntMax refintt1 refintt2 inttemp t1 t1 t2 t2 temp inta 3 b 5 Swap refa refb stringa 12 b xy Swap refa refb inta 3 b 5 Swap refa refb 29 2 为什么要引入泛型 通常在讨论数组时都需要预设一个前提 即到底要解决的是整数 小数 还是字符串的运算问题 因此 在使用数组时需要首先确定数组的类型 然后再把相同类型的数据放入数组中 例如 把100个整数存入数组中 得到一个整型数组 而把100个自定义的Student对象存入数组中 得到一个对象型或Student型数组 利用数组来管理数据 虽然直观 容易理解 但存在很大的局限性 仍然需要重复编写几乎完全相同的代码来完成排序和查找操作 为此 C 提供了一种更加抽象的数据类型 泛型 以克服数组的不足 当利用泛型来声明这样一个更抽象的数据类型之后 再也不需要针对诸如整数 小数 字符 字符串等数据重复编写几乎完全相同的代码 具体思路如下 首先声明这种泛型数据类型 声明时不用指定要处理的数据的类型 只讨论抽象的数据操作 如排序 查找等 在实际引用这种泛型数据类型时 先确定要处理的数据类型 再执行相应的操作 因此 泛型是一种 泛泛而谈 的数据类型 6 3 3泛型类 泛型方法和泛型接口 1 泛型类当一个类的操作不针对特定或具体的数据类型时 可把这个类声明为泛型类 泛型类最常用于集合 如链接列表 哈希表 堆栈 队列和树等 一般情况下 创建泛型类的过程为 从一个现有的具体类开始 逐一将每个类型更改为类型参数 一直达到通用化和可用性的最佳平衡 定义泛型类的一般形式如下 访问修饰符 class泛型类名 基类或接口 类型参数约束 类的成员 6 3 3泛型类 泛型方法和泛型接口 其中 访问修饰符 包括public protected和internal等 类型参数列表 不指定数据类型 当具有多个类型参数时使用逗号分隔 泛型类可以从基泛型类派生 也可以从泛型接口派生 当所声明的泛型类不是派生类时 省略基类和接口 类型参数约束 用来限定泛型类所要处理的数据类型 6 3 3泛型类 在C 中 一共有5类约束 分别如下 1 whereT struct 类型参数必须是值类型 2 whereT class 类型参数必须是引用类型 包括任何类 接口 委托或数组类型 3 whereT new 类型参数必须具有无参数的公共构造函数 当与其他约束一起使用时 new 约束必须最后指定 4 whereT 类型参数必须是指定的基类或派生自指定的基类 5 whereT 类型参数必须是指定的接口或实现指定的接口 可以指定多个接口约束 约束接口也可以是泛型的 6 3 3泛型类 实例6 4 泛型类的定义和使用演示 6
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025江苏连云港市赣榆农业发展集团有限公司及下属子公司招聘62人笔试参考题库附带答案详解
- 2025战新产业“330”中国能建葛洲坝集团社会招聘330人笔试参考题库附带答案详解
- 2025年宁德港务集团春季校园招聘24人笔试参考题库附带答案详解
- 2025年中航大(天津)科技园有限公司招聘4人笔试参考题库附带答案详解
- 2025年3月福建漳州台商投资区资产运营集团有限公司招聘人力资源服务外包人员13人笔试参考题库附带答案详解
- 2025届湖北宝钢股份黄石涂镀板有限公司应届毕业生招聘1人笔试参考题库附带答案详解
- 危险酒店安全知识培训内容课件
- 危险运输安全培训计划课件
- 地铁志愿者安全培训课件
- 地铁岗位安全培训总结课件
- 珠江医院护理面试题库及答案
- 流程管理某省市场营销MPR+LTC流程规划方案
- 疏浚管线工技能操作考核试卷及答案
- 化工厂实习安全培训课件
- 疏浚清淤工程合同协议书
- 电子电子技术试题及答案
- 2025项目管理考试题及答案
- 五年级篮球培训课件
- 护林员巡护安全知识培训课件
- 辽宁省2025年中考英语真题附答案
- 喷涂基础知识培训课件
评论
0/150
提交评论