




已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四讲字符串、String类和StringBuilder类,引言,字符串对大多数计算机程序而言是很普遍的。像文字处理软件和网页应用程序这些程序类型都广泛采用了字符串。这使得处理这类应用程序的程序员在字符串处理的效率问题上需要花费额外的心思。本讲主要介绍C#语言处理字符串的方法,分析如何使用String类,如何使用StringBuilder类。,2,主要内容,3.1串类型的定义3.2串的物理结构3.3串的算法3.4STRING类的应用3.5STRINGBUILDER类3.6STRING类和STRINGBUILDER类性能比较,3.1串类型的定义,串的定义,串是字符线性的一个有限序列。记作:A=a1a2.an其中:A是串名,引号括起来的部分为串的值,ai(1in)为任一字符,它称为串的元素,n为串的长度,且n0。,5,串的一些概念,若n=0,则此串称为空串,记作:A=“”。若A=“”,则称为空白串,其元素为空格符,常用表示。串的长度一般应有一定的限制。(如不超过255),6,串的一些概念,串中任意连续的若干字符组成的子序列称为该串的子串。包含子串的串又称为该子串的主串。子串在主串中第一次出现的第一个字符的位置称为子串在主串中的位置。,7,串的抽象数据类型定义,ADTString数据对象:D=ai|aiCharacterSet,i=1,2,.,n,n0数据关系:R1=|ai-1,aiD,i=2,.,n基本操作:StrAssign(若ST,则返回值0。,8,串的抽象数据类型定义,StrLength(S)初始条件:串S存在。操作结果:返回值S的元素个数,称为串的长度。Concat(chard;structnode*link;CAKE;,24,串和线性表,25,串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集。,串的基本操作和线性表有很大差别。在线性表的基本操作中,大多以“单个元素”作为操作对象;在串的基本操作中,通常以“串的整体”作为操作对象。,3.3串的算法,顺序结构的算法,27,一、求串长Len(s)/*求串s中除结束符外的字符个数*/chars;inti=0;while(si!=0);,+,-,return(i);,顺序结构的算法,28,二、联接串voidConcat(s,t)/*将t连接到s之后*/chars,t;intn,m,i;n=Len(s);m=Len(t);for(i=0;im;i+)sn+i=ti;sn+m=0;,顺序结构的算法,29,三、求子串voidSubstr(s,i,j,t)/*从s的第i个字符(下标为i-1)开始*/chars,t;/*取j个字符,构成的新串送t中*/inti,j;/*若无j个字符则只取到串尾*/intk;for(k=0;k+),(kj(新串在原位放不下),需要从下标为n-1开始到i+j-1的字符向后移动m-j位,m-j,顺序结构的算法,31,四、置换子串假设:从s串的第i个字符(下标为i-1)开始,取出j个字符,用t串置换这j个字符。若t串长为m,则有如下几种情况:,2、m=i+j-1;k-)sk+m-j=sk;/*从i+j-1开始依次后移m-j位*/,顺序结构的算法,34,四、置换子串,elseif(mj)/*若t串长小于j*/for(k=i+j-1;kn;k+)sk+m-j=sk;/*从i+j-1开始依次前移j-m位*/for(k=0;km;k+)sk+i-1=tk;/*置换进新串*/if(i+j=i-1;k-)sk+m=sk;/*从i-1开始以后的字符后移m位*/for(k=0;km;k+)sk+i-1=tk;sn+m=0;,顺序结构的算法,38,六、删除子串假设:删除串s中从第i个字符(下标为i-1)开始的连续j个字符。即:,i+j-1,n-j-1,i-1,这时,si+j-1移至下标为i-1,sn-1移至下标为n-j-1。,顺序结构的算法,39,六、删除子串假设:删除串s中从第i个字符(下标为i-1)开始的连续j个字符。即:,i+j-1,n-j-1,i-1,这时,si+j-1移至下标为i-1,sn-1移至下标为n-j-1。,si+j-1sn-1,顺序结构的算法,40,六、删除子串,voidDelete(s,i,j)/*删除串s中从第i个字符(下标为i-1)*/chars;inti,j;/*开始的连续j个字符*/intn,k;/*若无j个字符则只删到串尾*/n=Len(s);if(nlink!=NULL)/*寻找s串尾*/r=r-link;r-link=t;/*串尾结点的指针域指向t*/,3.4STRING类的应用,44,STRING类的应用,在C#语言中把字符序列用一对闭合的双引号包围起来就可以产生文字串。“DavidRuff”“thequickbrownfoxjumpedoverthelazydog”“123-45-6789”“”,45,C#语言中的字符串,C#语言中的字符串具有精神分裂的天性即字符串既是本地类型又是类的对象。实际上更准确的说法应该是可以把字符串作为本地数据值来使用,但是事实上每个产生的字符串都是String类的一个对象。,46,创建String对象,创建String的方式如下所示:stringname=“JenniferIngram”;也可以在两条分离的语句中先声明变量然后再进行赋值。声明的语法使得名字看上去就像一个规则的变量,但是实际上它是String对象的一个实例。,47,创建String对象,C#语言的字符串还允许在字符串中放置转义字符。转义字符用来把诸如换行符和制表符这类版式字符放置在字符串内。转义字符由一个反斜杠()开始,后边跟着单独一个表示版式的字母。例如,n说明换行,而t则表示一个制表符。stringname=“MikeMcMillannInstructor,CIStRoom306”;,48,常用String类的方法,虽然对字符串可以执行许多操作,但是一个小的操作集合却起着支配作用。三个最重要的操作分别是:1.找到字符串的子串。2.确定字符串的长度。3.确定字符在字符串中的位置。,49,字符串分离成单词的算法,找到字符串中第一个空格的位置。抽取第一个单词。从空格后边开始到字符串的末尾构建一个新的字符串。寻找新字符串中的第一个空格。如果没有其他空格,那么抽取的单词就从当前位置到字符串的末尾。否则循环返回第2步重复操作。,50,注意,String类已经有一个“把字符串分离成部分”的方法(Split方法),和一个“可以取走一个数据集合并且把几部分组合成一个字符串”的方法(Join方法)。,Split方法和Join方法,把字符串分解成独立的数据段是一种非常常见的功能,许多程序都把数据存储在一些字符串格式类型里。为了简化字符串的分解以及再次合并在一起的过程,String类提供了两种可用的方法:用于分解字符串的Split方法用来把存储在数组中的数据制作成字符串的Join方法,Split方法,Split方法取得一条字符串后,就会把它分解成数据成分块,然后把这些块放入String数组内。Split方法的实现集中在用来确定分解字符串位置的分离字符身上。在前例中,SplitWords函数始终采用空格作为分隔符。而在使用Split方法时则可以指定要寻找的分隔符的内容。分隔符就是此方法的第一个参数该参数必须以char型数组的形式出现而数组的第一个元素将是用作分隔符的字符,Split方法,许多应用程序是通过写出用逗号分隔的数据串的方式来输出数据的。这被称为是逗号分隔值串,或简称为CSVs。逗号分隔串就如同下列这样的形式:“Mike,McMillan,3000W.Scenic,NorthLittleRock,Ar,72118”此串内的每一个逻辑数据块都是用逗号进行分隔的。,Join方法,Join方法从数组变为字符串。此方法回取走两个参数:原始数组用来分隔元素的字符字符串是由跟着分隔符元素的数组元素组成构造出来的。还应该注意的是这种方法经常会被作为一种类方法来调用,这就意味着调用此方法来自String类本身而不是来自String的实例。,比较字符串的方法,在C#语言中有集中比较String对象的方法。最显而易见的方法就是关系运算符。然而,在某些情况下其他一些比较的方法则会更加有效。例如,如果希望知道字符串是大于、小于、还是等于另外一个字符串。,比较字符串的方法,字符串之间的互相比较的数字测量方法。这种测量就是Unicode表。每一个字符(实际上是每一种符号)都有一个Unicode值,操作系统就是用此数值把字符的二进制表示转化成为字符的形式。通过使用ASC函数可以确定字符的Unicode值。ASC实际上指的就是数的ASCII码。ASCII码是一种先于Unicode的早期数字编码,而ASC函数是在Unicode包含ASCII之前被首先开发出来的。,比较字符串的方法,为了找到字符的ASCII值,可以采用强制类型转换把字符简单地转换成为一个整数,如下所示:intcharCode;charCode=(int)a;这样会把数值97存储到变量中。,比较字符串的方法,两个字符串的比较实际就是比较它们的数字编码。字符串“a”和字符串“b”不相等,就是应为编码97不同于编码98。事实上compareTo方法可以用来确定两个String对象之间的精确关系。,Equal方法,第一个要检测的比较方法就是Equal方法。此方法会由一个String对象调用,并且会把另外一个String对象取作它的参数。此方法逐个字符的比较两个String对象。如果这两个String对象包含有相同的字符,那么方法就会返回一个True值。否则,方法就会返回False值。,CompareTo方法,下一个比较字符串的方法就是CompareTo。此方法也是取一个String作为参数,但是它不会布尔值。如果两个字符串相等,返回一个0。而如果传递给的字符串“低于”调用方法的字符串,返回-1。再如果传递给的字符串“高于”调用方法的字符串,返回的则是1。具体数值要由传递给的字符串和调用此方法的字符串实例之间的关系来决定,Compare方法,替换CompareTo方法的就是Compare方法。Compare方法通常会被做作为一个类方法来调用。Compare方法会执行和CompareTo方法相同的比较类型,而且对于相同的比较会返回相同的值。,StartsWith方法和EndsWith方法,StartsWith和EndsWith方法都回取一个字符串作为参数,而且若实例是以字符串参数作为开始或结束那么方法都会返回True值。,处理字符串的方法,字符串处理通常包括对字符串的改变操作。在字符串中插入新的字符从字符串中移除字符用新字符替换旧字符改变某些字符的情况向字符串添加空格从字符串中移除空格,Insert方法,Insert方法会把某个字符串插入到另外一个字符串的指定位置。Insert方法会返回新的字符串。调用此方法的格式如下所示:String1=String0.Insert(Position,String);,Remove方法,Remove方法会取走两个整数参数:一个开始位置一个计数器其中计数器就是要移除字符的数量。,Replace方法,Replace方法会取走两个参数:要移除掉的字符串用来替换掉的字符串此方方会返回新的字符串。,PadLeft方法和PadRight方法,PadLeft方法和PadRight方法在显示来自程序的数据时,为了数据排列美观而需要在打印区域内对数据进行排列时使用。PadLeft方法会对字符串进行右对齐排列PadRight方法会对字符串进行左对齐排列例如,需要在一个10个字符宽度区域内右对齐打印单词“Hello”,Concat方法,Concat方法与这一行代码创建了对象stBuff1,此对象的容量可以保存长度为16个字符的字符串,此容量是默认设置的。,74,构造StringBuilder对象,第二种方法:通过在构造器调用来创建对象StringBuilderstBuff2=newStringBuilder(25);这一行代码构建了一个初始可以保存25个字符的对象stBuff2。,75,构造StringBuilder对象,第三种方法:构造器调用会取字符串来创建对象StringBuilderstBuff3=newStringBuilder(Hello,world);这里的容量设置为16,这是因为字符串参数没有超过16个字符。如果字符串参数长度超过16,那么容量就会设置为32。每次一旦超过StringBuilder对象的容量,那么容量就会增加16个字符。,76,获取并且设置关于StringBuilder对象的信息,在StringBuilder类中有几种属性可以用来获取有关StringBuilder对象的信息。Length属性获取或设置当前实例中字符的数量Capacity属性返回当前实例的容量MaxCapacity属性返回当前实例对象所允许的最大字符数量,这个数量会随着对象添加更多的字符而自动增加。EnsureCapacity方法保持适于StringBuilder实例的最小容量,并传递一个整数来说明适于对象的最小容量。Chars属性返回在参数中指定位置上的字符,并设置字符作为参数来传递。,77,修改StringBuilder对象,Append方法可以在StringBuilder对象的末尾处添加字符。会取一个字符串值作为参数,并且把字符串串连到对象中当前值的末尾。AppendFormat方法可以给Stri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高素质人才识别与选拔技巧:从识人用人面试题及答案中学习
- 2025年副高卫生职称-临床医学类-全科医学(副高)代码:069历年参考题库含答案解析
- 永年招聘面试攻略:各行业常见面试题详解
- 2025年住院医师规培-重庆-重庆住院医师规培(超声医学科)历年参考题库典型考点含答案解析
- 防火应急面试实战题库:高级面试题及答案解析
- 2025年住院医师规培-贵州-贵州住院医师规培(核医学科)历年参考题库含答案解析(5套)
- 2025年住院医师规培-甘肃-甘肃住院医师规培(神经外科)历年参考题库含答案解析(5套)
- 2025年住院医师规培-湖北-湖北住院医师规培(精神科)历年参考题库含答案解析
- 2025年住院医师规培-海南-海南住院医师规培(麻醉科)历年参考题库含答案解析(5套)
- 2025年住院医师规培-海南-海南住院医师规培(放射肿瘤科)历年参考题库含答案解析
- 贷款押金合同协议书范本
- 房屋市政工程生产安全重大事故隐患判定检查表(2024版)
- 2025至2030国PLM市场深度调查与未来前景预测研究报告
- 抖音公会合同协议
- 轮胎维修安全管理制度
- 2025年资料员考试试题题库(100题)附答案
- 2025中国建设银行房屋按揭贷款合同书
- 电缆线路防外破施工方案
- 银行开公户章程范本
- 五年级数学(小数乘除法)计算题专项练习及答案汇编
- 恶劣天气行车安全培训
评论
0/150
提交评论