怎么样尽可能让数组HTmysql 存储数组位置更积聚

扫码下载官方APP
C语言程序设计精髓
& &对于这个地球上大多数人来说,真正的数字化革命还没有开始。在接下来的10年里,变化将无处不在,让我们一起来给这个世界编码吧!——Eric Schmidt Google执行主席& &&& &我们会用15周的时间来深入讲解C语言,在授课过程中,我们会注重多解释一些“为什么”以及错误程序的分析,从环环相扣的问题入手,将一些易被忽视且对高水平程序设计很重要的“点”,沿着数据结构从简单到复杂的主线逐一展开,在实例的“不断深化和提升”中引出知识点,通过对问题的举一反三和前后知识点的融会贯通,由浅入深地引导你循序渐进地编写规模逐步增大的程序。& &在过去30年90%的时间里,C语言独领风骚,仅偶尔被 Java 超越,可见其魅力。C语言作为一种高级语言,其实并不高级,但正是这种“低级”给我们更多思考的机会。期望通过本课程的学习,你不只是简单地能够掌握一种语言的语法,还能理解隐含在语法背后的思想,并初步具备灵活使用这些思想进行编写程序解决实际问题的能力。如果你掌握了这些,你会发现,迈向成功的最后一步不过是选择一种合适的编程工具而已。&& &你想从“菜鸟”升级为“程序猿”吗?那就加入“稀饭”的行列,和我们一起踏上爱上C语言之旅吧。
评分方案:本门课总成绩100分。每周的单元测验(单选题,15周,占45%);单元作业(编程题在线测试题,3-12周合计10周,占40%);课堂交流区的回帖质量和数量占5%,期末在线考试占10%。第1-2周的编程题以及第13-15周的编程题,作为自测练习题,不计入总分。练兵区的所有题目都不计入总分,仅供练兵而已。课程成绩和在讨论区义务为同学答疑的质量(发水贴者将被列入黑名单)将作为期末赠书奖励的参考。证书:设置“合格”(达到60分以上)、&优秀&(达到80分以上)两档标准,由任课教师签发课程结业证书,其中成绩“优秀”者将颁发优秀证书。
本门课程的基本内容是面向零基础的学生。进阶内容是面向有一定编程基础或学过本平台的“程序设计基础”MOOC课程(http://www.icourse163.org/course/HIT-56001)的学生,但是进阶内容不做为课程的考试内容。
第1周&初识C语言(主讲:苏小红,叶麟,赵玲玲):1.1 &计算机基础1.2 &C语言的集成开发环境&Code::Blocks和Visual C++6.0介绍1.3 &变量的定义和debug简介 &&1.4 &不同类型数据的存储与表示 & &1.5 &宏常量与const常量&第2周 简单计算(主讲:苏小红):2.1 &赋值运算符2.2 &算术运算符 &&2.3 &增1和减1运算符2.4 &自动类型转换与类型提升 &&2.5 &强制类型转换&第3周 输入输出(主讲:苏小红):3.1 &数据的格式化屏幕输出 & &3.2 &数据的格式化键盘输入 & &3.3 &单个字符的输入输出3.4 &进阶内容1——用getchar()输入数据存在的问题(错误案例分析)3.5 &进阶内容2——用%c格式符输入数据存在的问题(错误案例分析)&第4周 选择结构(主讲:苏小红):4.1 &关系运算和逻辑运算4.2 &条件语句 & &&4.3 &开关语句及错误案例分析4.4 &进阶内容——数值溢出和精度损失问题分析4.5 &进阶内容——软件测试和错误实例分析 &&第5周 循环结构(主讲:苏小红):& & & &&& &5.1 &计数控制的循环和累加累乘-for语句&5.2 &标记控制的循环和递推求解-while和do-while语句5.3 &条件控制的循环—猜数游戏5.4 &嵌套循环 &5.5 &流程的转移控制和穷举法求解问题5.6 &进阶内容——软件调试与错误实例分析&第6周 函数(主讲:苏小红):6.1 &函数定义、函数调用与参数传递、函数原型&6.2 &函数封装与程序的健壮性 & &&6.3 &断言与防御式编程 & &6.4 &进阶内容——代码风格&第7周 函数与递归(主讲:苏小红):7.1 &函数的嵌套调用和递归调用 &&7.2 &递归函数与函数调用栈&&&&&&7.3 &进阶内容——尾递归&7.4 &变量的作用域7.5 &变量的存储类型&第8周 数组(主讲:苏小红,叶麟):8.1 &数组的定义和初始化8.2 &进阶内容——数组元素的访问和螺旋矩阵8.3 &向函数传递一维数组和二维数组8.4 &计算最值和查找算法的函数实现8.5 &排序算法的函数实现8.6 &进阶内容——数组的其他应用&第9周 指针与字符串(主讲:苏小红):9.1 &指针变量的定义、初始化及其解引用 & &9.2 &指针变量做函数参数&9.3 &字符数组和字符指针9.4 &字符串处理函数第10周 指针与函数(主讲:苏小红):10.1 &向函数传递字符串&10.2 &从函数返回字符串 &10.3 &进阶内容——缓冲区溢出与数组下标越界问题 &10.4 &进阶内容——函数指针及其应用&第11周 指针与数组(主讲:苏小红):11.1&&指针的算术运算11.2 &指针和一维数组间的关系11.3 &进阶内容——指针和二维数组间的关系11.4 &进阶内容——指针数组及其应用 &第12周 结构体和共用体(主讲:苏小红):12.1 &结构体类型与结构体变量12.2 &结构体数组12.3 &结构体的相关计算和操作12.4 &向函数传递结构体及结构体指针 &&12.5 &枚举类型和共用体及其应用12.6 &进阶内容——结构体应用的典型实例&第13周 动态内存分配(主讲:苏小红,赵玲玲):11.1 C程序的内存映像和动态内存分配&11.2 进阶内容——动态数组 &11.3 进阶内容——常见的内存错误及其解决对策 & &&第14周&动态数据结构(主讲:赵玲玲):14.1 &单向链表 & & &14.2 &进阶内容——其他数据结构简介第15周 文件操作(主讲:苏小红,叶麟):15.1&&二进制文件、文本文件和标准输入输出流&15.2&&文件的打开和关闭15.3 & 按格式读写文件 & &&15.4 & 按字符和行读写文件& & & 15.4.1&按字符和行读写文件& & & 15.4.2&进阶内容——使用函数feof()的注意事项15.5&&按数据块读写文件 &15.6&&文件的随机读写和文件缓冲注:进阶内容有一定的难度,不在考试范围内。
1.& ()&该网站的服务对象是我们自编教材的读者,提供教材课件、例题源代码、教材勘误表等资源,便于学生浏览和下载后自学,读者也可利用该网站反馈教材使用意见和建议。2. &(http://sse./t)该网站的服务对象是使用我们自编教材的读者,在我们编写的由高等教育出版社出版的《C语言程序设计(第3版)》的封底有一个刮刮卡,刮开可以获得一个免费的注册账号,登陆我们开发的C语言作业在线测试系统,在该系统中可以自主选择教材对应章编号中的习题进行自测,提交习题答案后,系统会实时显示评分,另外在习题市场中读者还可以发布题目给其他读者练习。3. 参考教材1)苏小红,王宇颖,孙志岗,《C语言程序设计(第3版)》,高等教育出版社,2015年7月,购书网址:2)苏小红,车万翔,王甜甜,《C语言程序设计学习指导(第3版)》,高等教育出版社,2015年8月,购书网址:3)苏小红,孙志岗,陈惠鹏,《C语言大学实用教程(第4版)》,电子工业出版社,2017年1月,购书网址:亚马逊4)苏小红,孙志岗等,《C语言大学实用教程学习指导(第3版)》,电子工业出版社,2012年6月,购书网址:亚马逊5)苏小红等,《程序设计基础》,高等教育出版社,待出版5.相关链接:相关MOOC课程:: 带gcc编译器和gdb调试器的code::blocks集成开发环境的官网下载地址:(例如codeblocks-16.01mingw-setup.exe),安装注意事项见《C语言程序设计学习指导(第3版)》。安装软件的完整步骤可参考:
Q:如何提问,能得到快速的解答?A:1)标题:撰写标题时,要注意把要问的问题的出处和核心词写出来,最好用【】标出来,比如【第1周编程题在线测试的第1题】求解。2)内容:内容上要把你不懂的地方说出来,最好详细点,把自己尝试修改的过程也说一下。3)附源代码:把源码贴到讨论区(不要使用图片,因为图片看不清,也不能拷贝),这样大家可以通过你贴出的源码帮你分析错在哪里。4)附错误提示:把编译出错的提示也贴出来(一般是英文形式),这样大家不用拷贝粘贴和调试程序也能帮你分析出错原因了。Q:常见的运行结果错误的原因有哪些?A:程序提交后通常显示三类错误:格式错误、结果错误、运行超时。对于格式错误,请检查你的程序的输入输出信息是否和题目要求的完全一致。对于结果错误,请检查你的程序使用的算法和计算公式是否正确,如果涉及浮点运算,可以尝试将float换成double或者反之。对于运行超时错误,请检查你的程序是否存在死循环,死循环通常由永真的循环控制条件或者while后面添加了不必要的分号引起。注意在本网站提交程序进行测试时,不要使用flush()函数清除缓冲区,输入字符串也不要使用fgets(),原因详见视频讲解 。注意事项如下:1)数据输入输出的格式没有严格按照题目的要求写,直接拷贝粘贴题目中给的格式字符串和提示信息,是最简单和不易出现格式错误的方法。2)输入输出字符串中的字符大小写有错误,或者空格数量和位置与题目中的要求不一致,或者缺少换行等。3)仔细审题,例如题目要求计算半圆的周长,就不要加上直径,更不要计算整个圆的周长。4)如果只有几个测试用例通过,还有没有通过的测试用例,那么说明你没有考虑所有的可能性,甚至是非法输入的情况。5)检查是否为英文输入,切记切换成英文状态再输入。一些同学误用了中文作为输入法,就会出现不能编译的问题,例如中文状态下输入的分号和英文状态下输入的分号是完全不同的,语句的末尾使用的分号一定要在英文状态下输入。Q:如果无法正常观看视频,我该怎么办?A:如果无法正常观看视频,请尝试进行如下操作:1.确认你使用了支持视频播放的浏览器。切换到flash播放器无法调整播放速度,切换到HTML5播放器可以调整播放速度。建议都切换到HTML5播放器。2.清除浏览器的浏览数据及缓存。3.关闭硬件加速。请在浏览器的 设置 - 显示高级设置 中,将“使用硬件加速模式”(如果可用)一项取消勾选,并重新启动浏览器。4.检查你的网速。你可以尝试在其他视频网站播放视频(如优酷、土豆等),如果你在其他网站仍无法观看视频,那么你的网络连接很可能有问题。你需要重新连接你的网络或者切换至网速更快的网络以实现流畅的视频播放。Q:我想考二级,学完这个课程可以考吗?&A:二级考试题考查语言的语法细节较多,所以能否通过二级考试,要看你的应试水平如何。本课侧重于讲解程序设计的方法以及错误程序的排错方法,更关注实战能力,因此应该说本课程对学生的要求是高于二级考试的要求的。Q:上机编写C语言程序使用什么软件好?A:课程演示会使用Code::Blocks+gcc+gdb集成开发环境,但是你使用任何其他C语言开发工具也都可以。不过,我们推荐使用Code::Blocks,在()上有软件下载的网址链接,《C语言程序设计学习指导(第3版)》上有关于如何使用这个软件的详细介绍,它是一个开源的跨平台的C/C++集成开发环境,它安装简单,比Visual C 6.0等其他集成开发环境更简单易学。&Q:使用codeblocks在sources中新建一个file,也就是不在原来默认的main.c里面写代码,那么应该如何调试才能使运行的时候直接运行新建的里面的程序呢?A:给工程添加完新的文件后,移出旧的文件main.c再重新编译即可,移出文件的方法和添加的方法类似。&Q:为什么安装好软件后创建新项目的时候软件总是说:could not save project&invalid path& maybe the file is write-protected 呢?A:codeblocks要求软件安装的目录最好不要带空格或汉字,不要按默认设置安装到program file目录下,卸载后再选择安装到根目录下试试。更多注意事项,参见高等教育出版社的《C语言程序设计学习指导(第3版)》Q:请问为什么我在Code::Blocks里面点开Debug中的watch里面是空白的?A:按照视频1.2讲的方法新建一个控制台应用程序,不要直接新建一个C文件,直接新建或者打开一个 C文件是无法使用调试功能的。检查一下是不是将CB安装到默认的program files目录下了,CB不能安装到中文或者有空格的目录下,请卸载软件,重新安装到根目录下,再试试。此外,全速运行程序时,是看不到watch窗口内的内容的,必须在单步运行的时候才能看到watch窗口内的内容。Q:为什么我的程序编译不了?A:可能是你安装了不带编译器和调试器的版本,重新安装带编译器和调试器的版本。免费开源的C 语言集成开发环境Code::Blocks+gcc+gdb的官方下载网址:http://www.codeblocks.org/downloads/26(目前最新版本是codeblocks-16.01mingw-setup.exe)。请下载带gcc编译器和gdb调试器的code::blocks(下载软件名中务必包含mingw-setup),否则程序无法编译。无法从官方下载软件的,也可以从百度云盘上下载:链接: /s/1dDnLNET 密码: joyhC 语言集成开发环境code::blocks的安装和使用方法见教材《C语言程序设计学习指导(第3版)》如果不想重装系统,可参考重新设置编译器和调试器。安装软件的完整步骤可参考:Q:为什么我的程序无法运行,显示cannot open output file bin\Debug\election.exe Permission denied.A:可能是你的文件正在别的程序中使用,或者还有程序的副本正在执行(或者你上次运行没有关闭),因此不能写入election.exe,把副本关闭或者结束election.exe任务应该就能够纠正这个问题。另外,请检查一下你的IDE是不是是不是安装到C盘的默认目录下了,请将IDE安装到D盘,并将你的程序也保存到D盘,不要保存到C盘。Q:为什么我的程序与网站上的程序运行结果中的小数点最后一位存在差异?A: 这是因为网站的OJ使用的操作系统和编译器与我们自己使用的操作系统和编译器不一样,从而导致浮点运算的精度不一致。此外,使用float和double定义变量得到的计算结果也可能在结果的最后一位小数上有所不同。
由高教社联手网易推出,让每一个有提升愿望的用户能够学到中国知名高校的课程,并获得认证。
| 京ICP备号-2 |
(C) icourse163.orgC#集合大全 数组 类 泛型 &转&
时间: 10:31:08
&&&& 阅读:70
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&总结C#&集合类&Array&Arraylist&List&Hashtable&Dictionary&Stack&Queue&
&我们用的比较多的非泛型集合类主要有&ArrayList类&和&HashTable类。我们经常用HashTable&来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和拆箱的负担,如果我们操纵的数据类型相对确定的化&用Dictionary&TKey,TValue&&集合类来存储数据就方便多了,例如我们需要在电子商务网站中存储用户的购物车信息(商品名,对应的商品个数)时,完全可以用&Dictionary&string,&int&&来存储购物车信息,而不需要任何的类型转化。
1.数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小,&
但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的&
2.数组要声明元素的类型,集合类的元素类型却是object.&
3.数组可读可写不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。&
4.数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。集合也是数据列表却不使用下标访问。&
很多时候集合有定制的下标类型,对于队列和栈根本就不支持下标访问!&
1.&&&&&&&数组&
int[]&intArray1;&
//初始化已声明的一维数组&
intArray1&=&new&int[3];&
intArray1&=&new&int[3]{1,2,3};&
intArray1&=&new&int[]{1,2,3};&
2.&&&&&&&ArrayList类对象被设计成为一个动态数组类型,其容量会随着需要而适当的扩充&
1:Add()向数组中添加一个元素,&
2:Remove()删除数组中的一个元素&
3:RemoveAt(int&i)删除数组中索引值为i的元素&
4:Reverse()反转数组的元素&
5:Sort()以从小到大的顺序排列数组的元素&
6:Clone()复制一个数组&
System.Collections&命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。System.Collections.Generic&命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。System.Collections.Specialized&命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。ArrayList&类:使用大小可按需动态增加的数组。
using&Susing&System.Collections.Gusing&System.Tusing&System.Cnamespace&ConsoleApplication1{&&&&class&Program&&&{&&&&&&&static&void&Main(string[]&args)&&&&&&&&{&&&&&&&&&&&&ArrayList&al&=&new&ArrayList();&&&&&&&&&&&&al.Add(100);//单个添加&&&&&&&&&&&foreach&(int&number&in&new&int[6]&{&9,&3,&7,&2,&4,&8&})&&&&&&&&&&&{&&&&&&&&&&&&&&&&al.Add(number);//集体添加方法一&&&&&&&&&&&}&&&&&&&&&&&int[]&number2&=&new&int[2]&{&11,&12&};&&&&&&&&&&&al.AddRange(number2);//集体添加方法二&&&&&&&&&&&al.Remove(3);//移除值为3的&&&&&&&&&&&al.RemoveAt(3);//移除第3个&&&&&&&&&&ArrayList&al2&=&new&ArrayList(al.GetRange(1,&3));//新ArrayList只取旧ArrayList一部份&&&&&&&&&&&Console.WriteLine("遍历方法一:");&&&&&&&&&&&&foreach&(int&i&in&al)//不要强制转换&&&&&&&&&&&{&&&&&&&&&&&&&&&Console.WriteLine(i);//遍历方法一&&&&&&&&&&&}&&&&&&&&&&&&Console.WriteLine("遍历方法二:");&&&&&&&&&&&&for&(int&i&=&0;&i&&&al2.C&i++)//数组是length&&&&&&&&&&&&{&&&&&&&&&&&&&&&int&number&=&(int)al2[i];//一定要强制转换&&&&&&&&&&&&&&&Console.WriteLine(number);//遍历方法二&&&&&&&&&&&}&&&&&&&}&&&}}
3.&&&&&&&List&
可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法,在决定使用&List&还是使用&ArrayList&类(两者具有类似的功能)时,记住&List&类在大多数情况下执行得更好并且是类型安全的。如果对&List&类的类型&T&使用引用类型,则两个类的行为是完全相同的。但是,如果对类型&T&使用值类型,则需要考虑实现和装箱问题。&
如果对类型&T&使用值类型,则编译器将特别针对该值类型生成&List&类的实现。这意味着不必对&List&对象的列表元素进行装箱就可以使用该元素,并且在创建大约&500&个列表元素之后,不对列表元素装箱所节省的内存将大于生成该类实现所使用的内存。&
//声明一个List对象,只加入string参数&
List&string&&names&=&new&List&string&();&
names.Add("乔峰");&
names.Add("欧阳峰");&
names.Add("马蜂");&
//遍历List&
foreach&(string&name&in&names)&
Console.WriteLine(name);&
//向List中插入元素&
names.Insert(2,&"张三峰");&
//移除指定元素&
names.Remove("马蜂");&
4.&&&&&&&Dictionary&
&&泛型最常见的用途是泛型集合,命名空间System.Collections.Generic&中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。&&&&&很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:
非泛型集合类
泛型集合类
DIctionary&T&
SortedList
SortedList&T&
&&&&我们用的比较多的非泛型集合类主要有&ArrayList类&和&HashTable类。我们经常用HashTable&来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和拆箱的负担,如果我们操纵的数据类型相对确定的化&&用&Dictionary&TKey,TValue&&集合类来存储数据就方便多了,例如我们需要在电子商务网站中存储用户的购物车信息(&商品名,对应的商品个数)时,完全可以用&Dictionary&string,&int&&来存储购物车信息,而不需要任何的类型转化。&&&&下面是简单的例子,包括声明,填充键值对,移除键值对,遍历键值对
&&& Dictionary&string,&string&&myDic&=&new&Dictionary&string,&string&();&&&&myDic.Add("aaa",&"111");&&&&myDic.Add("bbb",&"222");&&& myDic.Add("ccc",&"333");&&& myDic.Add("ddd",&"444");&&&&//如果添加已经存在的键,add方法会抛出异常&&&&try&&&{&&&&&&&myDic.Add("ddd","ddd");&&&}&&&&catch&(ArgumentException&ex)&&&{&&&&&&&Console.WriteLine("此键已经存在:"&+&ex.Message);&&&&}&&//解决add()异常的方法是用ContainsKey()方法来判断键是否存在&&if&(!myDic.ContainsKey("ddd"))&&{&&&&&&&myDic.Add("ddd",&"ddd");&&&&}&&&else&&&{&&&&&&&Console.WriteLine("此键已经存在:");&&&&&&}&&&&//而使用索引器来负值时,如果建已经存在,就会修改已有的键的键值,而不会抛出异常&&&myDic&["ddd"]="ddd";&&&&myDic["eee"]&=&"555";&&&&&&//使用索引器来取值时,如果键不存在就会引发异常&&&&try&&&{&&&&&&&Console.WriteLine("不存在的键\"fff\"的键值为:"&+&myDic["fff"]);&&&}&&&catch&(KeyNotFoundException&ex)&&&&{&&&&&&&Console.WriteLine("没有找到键引发异常:"&+&ex.Message);&&&&}&&&//解决上面的异常的方法是使用ContarnsKey()&来判断时候存在键,如果经常要取健值得化最好用&TryGetValue方法来获取集合中的对应键值&&&string&value&=&"";&&&if&(myDic.TryGetValue("fff",&out&value))&&&&{&&&&&&&&Console.WriteLine("不存在的键\"fff\"的键值为:"&+&value&);&&&}&&&&else&&&&{&&&&&&&&&&&&&Console.WriteLine("没有找到对应键的键值");&&&&&}&&&&&&//下面用foreach&来遍历键值对&&&&//泛型结构体&用来存储健值对&&&&foreach&(KeyValuePair&string,&string&&kvp&in&myDic)&&&&{&&&&&&&&Console.WriteLine("key={0},value={1}",&kvp.Key,&kvp.Value);&&&}&&&&//获取值得集合&&&&foreach&(string&s&in&myDic.Values)&&&{&&&&&&&&Console.WriteLine("value={0}",&s);&&&&}&&&&//获取值得另一种方式&&&&Dictionary&string,&string&.ValueCollection&values&=&myDic.V&&&foreach&(string&s&in&values)&&&{&&&&&&&Console.WriteLine("value={0}",&s);&&&&}
常用的属性和方法如下:&
获取用于确定字典中的键是否相等的&。&
获取包含在&Dictionary&中的键/值对的数目。
获取或设置与指定的键相关联的值。
获取包含&Dictionary&中的键的集合。
获取包含&Dictionary&中的值的集合。
常用的方法
将指定的键和值添加到字典中。&
从&Dictionary&中移除所有的键和值。&
确定&Dictionary&是否包含指定的键。&
确定&Dictionary&是否包含特定值。&
已重载。&确定两个&&实例是否相等。&(从&&继承。)
返回循环访问&Dictionary&的枚举数。&
用作特定类型的哈希函数。&适合在哈希算法和数据结构(如哈希表)中使用。&(从&&继承。)
实现&&接口,并返回序列化&Dictionary&实例所需的数据。&
获取当前实例的&。&(从&&继承。)
实现&System.Runtime.Serialization.ISerializable&接口,并在完成反序列化之后引发反序列化事件。&
确定指定的&Object&实例是否是相同的实例。&(从&&继承。)
从&Dictionary&中移除所指定的键的值。&
返回表示当前&Object&的&。&(从&&继承。)
获取与指定的键相关联的值。&
6.Hashtable类&
一、哈希表(Hashtable)简述&&&&&在.NET&Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对.二、哈希表的简单操作在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value);在哈希表中去除某个key/value键值对:HashtableObject.Remove(key);从哈希表中移除所有元素:&&&&&&&&&&&&&&&&HashtableObject.Clear();&判断哈希表是否包含特定键key:&&&&&&&&&HashtableObject.Contains(key);下面控制台程序将包含以上所有操作:
using&Susing&System.C&//使用Hashtable时,必须引入这个命名空间class&hashtable{&&&&public&static&void&Main()&&&{&&&Hashtable&ht=new&Hashtable();&//创建一个Hashtable实例&&&&ht.Add("E","e");//添加key/value键值对&&&&ht.Add("A","a");&&&&ht.Add("C","c");&&&&ht.Add("B","b");&&&&string&s=(string)ht["A"];&&&&if(ht.Contains("E"))&//判断哈希表是否包含特定键,其返回值为true或false&&&&&&Console.WriteLine("the&E&key:exist");&&&&ht.Remove("C");//移除一个key/value键值对&&&&&Console.WriteLine(ht["A"]);//此处输出a&&&&&ht.Clear();//移除所有元素&&&&&Console.WriteLine(ht["A"]);&//此处将不会有任何输出&&&&}}
三、遍历哈希表遍历哈希表需要用到DictionaryEntry&Object,代码如下:
for(DictionaryEntry&de&in&ht)&//ht为一个Hashtable实例{&&&&Console.WriteLine(de.Key);//de.Key对应于key/value键值对key&&&&Console.WriteLine(de.Value);//de.Key对应于key/value键值对value}
四、对哈希表进行排序&&&&&对哈希表进行排序在这里的定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:
ArrayList&akeys=new&ArrayList(ht.Keys);&//别忘了导入System.Collectionsakeys.Sort();&//按字母顺序进行排序foreach(string&skey&in&akeys){&&&&Console.Write(skey&+&":");&&&&Console.WriteLine(ht[skey]);//排序后输出}
哈希表,名-值对。类似于字典(比数组更强大)。哈希表是经过优化的,访问下标的对象先散列过。如果以任意类型键值访问其中元素会快于其他集合。&
GetHashCode()方法返回一个int型数据,使用这个键的值生成该int型数据。哈希表获取这个值最后返回一个索引,表示带有给定散列的数据项在字典中存储的位置。&
Hashtable&和&Dictionary&&K,&V&&类型&&1:单线程程序中推荐使用&Dictionary,&有泛型优势,&且读取速度较快,&容量利用更充分.&2:多线程程序中推荐使用&Hashtable,&默认的&Hashtable&允许单线程写入,&多线程读取,&对&Hashtable&进一步调用&Synchronized()&方法可以获得完全线程安全的类型.&而&Dictionary&非线程安全,&必须人为使用&lock&语句进行保护,&效率大减.&3:Dictionary&有按插入顺序排列数据的特性&(注:&但当调用&Remove()&删除过节点后顺序被打乱),&因此在需要体现顺序的情境中使用&Dictionary&能获得一定方便.
HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。存储桶是&HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。
HashTable的应用场合有:做对象缓存,树递归算法的替代,和各种需提升效率的场合。
&&&&//Hashtable&sample&&&&System.Collections.Hashtable&ht&=&new&System.Collections.Hashtable();&&&&&//--Be&careful:&Keys&can‘t&be&duplicated,&and&can‘t&be&null----&&&&ht.Add(1,&"apple");&&&&ht.Add(2,&"banana");&&&&ht.Add(3,&"orange");&&&&&&&&&//Modify&item&value:&&&&if(ht.ContainsKey(1))&&&&&&&&ht[1]&=&"appleBad";&&&&&//The&following&code&will&return&null&oValue,&no&exception&&&&object&oValue&=&ht[5];&&&&&&&&&&//traversal&1:&&&&foreach&(DictionaryEntry&de&in&ht)&&&&{&&&&&&&&Console.WriteLine(de.Key);&&&&&&&&Console.WriteLine(de.Value);&&&&}&&&&&//traversal&2:&&&&System.Collections.IDictionaryEnumerator&d&=&ht.GetEnumerator();&&&&while&(d.MoveNext())&&&&{&&&&&&&&Console.WriteLine("key:{0}&value:{1}",&d.Entry.Key,&d.Entry.Value);&&&&}&&&&&//Clear&items&&&&ht.Clear();
Dictionary和HashTable内部实现差不多,但前者无需装箱拆箱操作,效率略高一点。
&&&&//Dictionary&sample&&&&System.Collections.Generic.Dictionary&int,&string&&fruits&=&&&&&&&&&&new&System.Collections.Generic.Dictionary&int,&string&();&&&&&fruits.Add(1,&"apple");&&&&fruits.Add(2,&"banana");&&&&fruits.Add(3,&"orange");&&&&&foreach&(int&i&in&fruits.Keys)&&&&{&&&&&&&&Console.WriteLine("key:{0}&value:{1}",&i,&fruits);&&&&&}&&&&if&(fruits.ContainsKey(1))&&&&{&&&&&&&&Console.WriteLine("contain&this&key.");&&&&}
HashTable是经过优化的,访问下标的对象先散列过,所以内部是无序散列的,保证了高效率,也就是说,其输出不是按照开始加入的顺序,而Dictionary遍历输出的顺序,就是加入的顺序,这点与Hashtable不同。如果一定要排序HashTable输出,只能自己实现:
&&&&//Hashtable&sorting&&&&System.Collections.ArrayList&akeys&=&new&System.Collections.ArrayList(ht.Keys);&//from&Hashtable&&&&akeys.Sort();&//Sort&by&leading&letter&&&&foreach&(string&skey&in&akeys)&&&&{&&&&&&&&Console.Write(skey&+&":");&&&&&&&&Console.WriteLine(ht[skey]);&&&&}
HashTable与线程安全:
为了保证在多线程的情况下的线程同步访问安全,微软提供了自动线程同步的HashTable:&
如果&HashTable要允许并发读但只能一个线程写,&要这么创建&HashTable实例:
&&&&//Thread&safe&HashTable&&&&System.Collections.Hashtable&htSyn&=&System.Collections.Hashtable.Synchronized(new&System.Collections.Hashtable());
这样,&如果有多个线程并发的企图写HashTable里面的&item,&则同一时刻只能有一个线程写,&其余阻塞;&对读的线程则不受影响。
另外一种方法就是使用lock语句,但要lock的不是HashTable,而是其SyncRoot;虽然不推荐这种方法,但效果一样的,因为源代码就是这样实现的:
//Thread&safe
private&static&System.Collections.Hashtable&htCache&=&new&System.Collections.Hashtable&();
public&static&void&AccessCache&()
&&&&lock&(&htCache.SyncRoot&)
&&&&&&&&htCache.Add&(&"key",&"value"&);
&&&&&&&&//Be&careful:&don‘t&use&foreach&to&operation&on&the&whole&collection
&&&&&&&&//Otherwise&the&collection&won‘t&be&locked&correctly&even&though&indicated&locked
&&&&&&&&//--by&MSDN
//Is&equivalent&to&等同于&(lock&is&equivalent&to&Monitor.Enter&and&Exit()
public&static&void&AccessCache&()
&&&&System.Threading.Monitor.Enter&(&htCache.SyncRoot&);
&&&&&&&&/*&critical&section&*/
&&&&&&&&htCache.Add&(&"key",&"value"&);
&&&&&&&&//Be&careful:&don‘t&use&foreach&to&operation&on&the&whole&collection
&&&&&&&&//Otherwise&the&collection&won‘t&be&locked&correctly&even&though&indicated&locked
&&&&&&&&//--by&MSDN
&&&&finally
&&&&&&&&System.Threading.Monitor.Exit&(&htCache.SyncRoot&);
7.&Stack类&
Stack:栈,表示对象的简单的后进先出非泛型集合。Push方法入栈,Pop方法出栈。
using&Susing&System.Collections.Gusing&System.Tusing System.Cnamespace&ConsoleApplication1{&&&class&Program{&&&&&&&static&void&Main(string[]&args)&&&&&&&{&&&&&&&&&&&Stack&sk&=&new&Stack();&&&&&&&&&&&&Stack&sk2&=&new&Stack();&&&&&&&&&&&foreach&(int&i&in&new&int[4]&{&1,&2,&3,&4&})&&&&&&&&&&&{&&&&&&&&&&&&&&&sk.Push(i);//入栈&&&&&&&&&&&&&&&&sk2.Push(i);&&&&&&&&&&&&}&&&&&&&&&&&&foreach&(int&i&in&sk)&&&&&&&&&&&{&&&&&&&&&&&&&&&Console.WriteLine(i);//遍历&&&&&&&&&&&&}&&&&&&&&&&&sk.Pop();//出栈&&&&&&&&&&&Console.WriteLine("Pop");&&&&&&&&&&&foreach&(int&i&in&sk)&&&&&&&&&&&&{&&&&&&&&&&&&&&&Console.WriteLine(i);&&&&&&&&&&&&}&&&&&&&&&&&sk2.Peek();//弹出最后一项不删除&&&&&&&&&&&&Console.WriteLine("Peek");&&&&&&&&&&&foreach&(int&i&in&sk2)&&&&&&&&&&&{&&&&&&&&&&&&&&&&Console.WriteLine(i);&&&&&&&&&&&&}&&&&&&&}&&&&}}
8.Queue类&
队列,先进先出。enqueue方法入队列,dequeue方法出队列。&
using&Susing&System.Collections.Gusing&System.Tusing&System.Cnamespace&ConsoleApplication1{&&&&class&Program&&&&{&&&&&&&static&void&Main(string[]&args)&&&&&&&{&&&&&&&&&&&Queue&qu&=&new&Queue();&&&&&&&&&&&&Queue&qu2&=&new&Queue();&&&&&&&&&&&foreach&(int&i&in&new&int[4]&{&1,&2,&3,&4&})&&&&&&&&&&&{&&&&&&&&&&&&&&&&qu.Enqueue(i);//入队&&&&&&&&&&&&&&&&qu2.Enqueue(i);&&&&&&&&&&&&}&&&&&&&&&&&foreach&(int&i&in&qu)&&&&&&&&&&&{&&&&&&&&&&&&&&&Console.WriteLine(i);//遍历&&&&&&&&&&&&}&&&&&&&&&&&&qu.Dequeue();//出队&&&&&&&&&&&&Console.WriteLine("Dequeue");&&&&&&&&&&&foreach&(int&i&in&qu)&&&&&&&&&&&{&&&&&&&&&&&&&&&&Console.WriteLine(i);&&&&&&&&&&&}&&&&&&&&&&&qu2.Peek();//返回位于&Queue&开始处的对象但不将其移除。&&&&&&&&&&&Console.WriteLine("Peek");&&&&&&&&&&&foreach&(int&i&in&qu2)&&&&&&&&&&&{&&&&&&&&&&&&&&&Console.WriteLine(i);&&&&&&&&&&&}&&&&&&&}&&}}标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/weiterli/p/7897205.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!}

我要回帖

更多关于 php redis 存储数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信