《第06章_字符串处理.ppt》由会员分享,可在线阅读,更多相关《第06章_字符串处理.ppt(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java程序设计程序设计主讲教师:主讲教师:主讲教师:主讲教师:工作单位:工作单位:工作单位:工作单位:计算机学院计算机学院计算机学院计算机学院电子邮件:电子邮件:电子邮件:电子邮件: 第六章第六章字符串处理字符串处理n n本章将介绍本章将介绍JavaJava语言中字符串的处理技术。主要涉及在程序运行初语言中字符串的处理技术。主要涉及在程序运行初始化后不能改变的字符串类始化后不能改变的字符串类StringString和字符串内容可以动态改变的类和字符串内容可以动态改变的类StringBufferStringBuffer,以及用于进行字符串词法分析类,以及用于进行字符串词法分析类StringTo
2、kenizerStringTokenizer。同时还。同时还将介绍字符串和其它数据类型间的转换。将介绍字符串和其它数据类型间的转换。n n在在C/C+C/C+中,字符串是以字符数组的方式来处理的,以字符中,字符串是以字符数组的方式来处理的,以字符 00作为字符串结束的标志,因此在进行字符串处理时比较容易发生错误。作为字符串结束的标志,因此在进行字符串处理时比较容易发生错误。而而JavaJava则将字符串作为对象来处理,在对象中封装了一系列方法来进行则将字符串作为对象来处理,在对象中封装了一系列方法来进行字符串处理。利用字符串处理。利用JavaJava字符串处理技术不仅可以减少程序设计的工作量,
3、字符串处理技术不仅可以减少程序设计的工作量,而且使程序编制更加规范,从而可以减少错误的发生。而且使程序编制更加规范,从而可以减少错误的发生。第六章第六章字符串处理字符串处理6.1String6.1String类类类类6.26.2StringBufferStringBuffer类类类类6.36.3StringTokenizerStringTokenizer类的应用类的应用类的应用类的应用6.46.4字符串与其他数据类型的转换字符串与其他数据类型的转换字符串与其他数据类型的转换字符串与其他数据类型的转换6.1String类类6.1.16.1.1字符串的构造字符串的构造字符串的构造字符串的构造6.1
4、.2String6.1.2String类的常用方法类的常用方法类的常用方法类的常用方法6.1.1字符串的构造字符串的构造6.1.1字符串的构造字符串的构造字符串的声明和其它类一样,如下格式Strings;创建字符串可以使用String类的构造方法。例如:s=newString(“Wearestudents”);s=“Wearestudents”;声明和实例化对象也可一步完成:Strings=newString(Wearestudents);Strings=Wearestudents;6.1.1字符串的构造字符串的构造例如:1)在String类提供的构造方法中,可以由字符数组、字节数组以及字符串
5、缓冲区来构成字符串,如下面的代码所示。charcDem0l=2,3,4,5;charcDem02=1,2,3,4,5;StringstrDem01=newString(cDem0l);StringstrDem02=newString(cDem02,1,4);System.out.println(strDem01+strDem01);利用上面的两个构造方法生成的字符串实例的内容均为“2345”。2)下面例子说明如何利用字节数组生成字符串:bytecDem0l=66,67,68;bytecDem02=65,66,67,68;StringstrDem01=newString(cDem0l);Stri
6、ngstrDem02=newString(cDem02,1,3);利用上面的两个构造方法生成的字符串实例的内容均为BCD。6.1.2String类的常用方法类的常用方法String类提供了length()、charAt()、indexOf()、lastIndexOf()、getChars()、getBytes()、toCharArray()等方法。在这些方法中,按用途来分,可以分为字符串长度计算、字符串比较、字符串检索、字符串的截取、替换等方法,下面我们将详细介绍这些方法。6.1.2String类的常用方法类的常用方法1、字符串长度计算、字符串长度计算使用String类中的length()方法
7、可以获取一个字符串的长度。length()方法的定义如下:publicintlength()该方法返回字符串中的16-bit的Unicode字符的数量。例如:Strings=wearestudents,tom=我们是学生;intn1,n2,n3;n1=s.length();/n1的值是15n2=tom.length();/n2的值5n3=”我的爱好”.length();/n3值是46.1.2String类的常用方法类的常用方法2、字符串比较、字符串比较字符串比较的方法有equals()、equalsIgnoreCase()、startsWith(),endsWith()、regionMatch
8、es()、compareTo(),compareToIgnoreCase()等方法(1)、equals和和equalsIgnoreCase方法方法在String类中equals()定义如下:publicbooleanequals(Strings)该方法用来比较当前字符串对象的实体是否与参数指定的字符串s的实体是否相同。例如Stringtom=newString(wearestudents);Stringboy=newString(Wearestudents);Stringjerry=newString(wearestudents);tom.equals(boy)的值是false,tom.equ
9、als(jerry)的值是true.6.1.2String类的常用方法类的常用方法在String类中equalsIgnoreCase()定义如下:publicbooleanequalsIgnoreCase(Strings)字符串对象调用比较当前字符串对象是否与参数指定的字符串s相同,比较时忽略大小写。例如:Stringtom=newString(“ABC”),Jerry=newString(“abc”);tom.equalsIgnoreCase(Jerry)的值是true。(2)、startsWith、endsWith方法方法字符串对象调用publicbooleansrartsWith(Str
10、ings)方法,判断当前字符串对象的前缀是否是参数指定的字符串s,如Stringtom=220302620629021,jerry=21079670924022;tom.startsWith(220)的值是true;jerry.startsWith(220)的值是false。6.1.2String类的常用方法类的常用方法可以使用publicbooleanendsWith(Strings)方法,判断一个字符串的后缀是否是字符串s,如Stringtom=220302620629021,jerry=21079670924022;tom.endsWith(021)的值是truejerry.endsWi
11、th(021)的值是false.6.1.2String类的常用方法类的常用方法【例例6-1】通过学号判断某学生是否是2004级的男生。假设某学生学号为“200400581”,前4位为学号,最后1位为性别标志位,0表示女生,1表示男生。程序如下:publicclassStringStartpublicstaticvoidmain(Stringargs)Stringjohn=200400581,start=2004;if(john.startsWith(start)&(tom.endsWith(1)System.out.println(该生是2004级男学生。);elseSystem.out.pr
12、intln(“该生不是2004级男学生。);程序的运行结果如下:该生是2004级男学生。6.1.2String类的常用方法类的常用方法(3)、regionMatches方法方法该方法的申明格式为:publicbooleanregionMatches(intfirstStart,Stringother,intortherStart,intlength)和publicbooleanregionMatches(booleanb,intfirstStart,Stringother,intortherStart,intlength)从当前字符串参数firstStart指定的位置开始处,取长度为lengt
13、h的一个子串,并将这个子串和参数other指定的一个子串进行比较。其中other指定的子串是从参数othertStart指定的位置开始,从other中取长度为length的一个子串。如果两个子串相同该方法就返回true,否则返回false。注意,字符串的位置编号从0开始。6.1.2String类的常用方法类的常用方法(4)、compareTo,compareToIgnoreCase方法方法String类中中compareTo和compareToIgnoreCase方法申明的格式为:publicintcompareTo(Strings)publicintcompareToIgnoreCase(S
14、trings)compareTo方法,按字典顺序与参数s指定的字符串比较大小。如果当前字符串与s相同,该方法返回值0,如果当前字符串对象大于s,该方法返回正值,如果小于s,该方法返回负值。例如Stringstr=abcde;pareTo(boy);/小于pareTo(“aba”);/大于pareTo(“abcde”);/等于0按辞典序比较两个字符串还可以使用compareToIgnoreCase(Strings)方法,该方法忽略大小写6.1.2String类的常用方法类的常用方法【例例6-2】将下面的字符串数组按字典序重新排列publicclassSortStrspublicstaticvoi
15、dmain(Stringargs)Stringa=Java,Basic,C+,Fortran,SmallTalk;for(inti=0;ia.length-1;i+)for(intj=i+1;ja.length;j+)if(pareTo(ai)0)Stringtemp=ai;ai=aj;aj=temp;for(inti=0;ia.length;i+)System.out.print(+ai);程序的运行结果如下:BasicC+FortranJavaSmallTalkn nclassclassStringArrayStringArrayn n n npublicstaticvoidpublics
16、taticvoidmain(Stringmain(Stringargsargs)n n n n/定义字符串数组定义字符串数组定义字符串数组定义字符串数组n nStringarray=newStringarray=newStringThisStringThisisatest,isatest,n nTheoWasher,TheoWasher,n nthecaseisclosed,thecaseisclosed,n n tHetHe aLtErNaTiNgaLtErNaTiNg StRiNgStRiNg n n;n nSystem.out.printlnSystem.out.println(排序之前
17、:排序之前:排序之前:排序之前:+n);+n);n n/打印出排序之前的字符串数组打印出排序之前的字符串数组打印出排序之前的字符串数组打印出排序之前的字符串数组n nfor(for(intinti=0;ii=0;iarray.lengtharray.length;i+);i+)n nSystem.out.println(arrayiSystem.out.println(arrayi););n nn nSystem.out.printlnSystem.out.println(排序之后:排序之后:排序之后:排序之后:+n);+n);n n/调用调用调用调用ArraysArrays对象的方法对字符串
18、数组进行排序对象的方法对字符串数组进行排序对象的方法对字符串数组进行排序对象的方法对字符串数组进行排序n njava.util.Arrays.sort(arrayjava.util.Arrays.sort(array,String.CASE_INSENSITIVE_ORDERString.CASE_INSENSITIVE_ORDER););n n/打印出排序之后的字符串数组打印出排序之后的字符串数组打印出排序之后的字符串数组打印出排序之后的字符串数组n nfor(for(intinti=0;ii=0;iarray.lengtharray.length;i+);i+)n nSystem.out.
19、println(arrayiSystem.out.println(arrayi););n n/7-5/7-5MainA.javaMainA.javaimportimportjava.utiljava.util.*;.*;classMainclassMain publicstaticvoidpublicstaticvoidmain(Stringmain(Stringargsargs)StringStringstrsstrs=dog,pig,cat;=dog,pig,cat;Arrays.sort(strsArrays.sort(strs););/“cat”,“dog”,“pig”/“cat”,“
20、dog”,“pig”System.out.printlnSystem.out.println(Arrays.asList(strsArrays.asList(strs););intintintsints=9,5,1,7;=9,5,1,7;Arrays.sort(intsArrays.sort(ints););for(for(intinti=0;ii=0;iints.lengthints.length;i+);i+)/1579/1579System.out.printSystem.out.print(intsiintsi+);+);/SortDemo.javaSortDemo.javaimpor
21、timportjava.utiljava.util.*;.*;publicclasspublicclassSortDemoSortDemo/实现实现实现实现ComparatorComparator接口的静态类接口的静态类接口的静态类接口的静态类staticclassCompimplementsComparatorstaticclassCompimplementsComparatorpublicpublicintintcompare(Objectobj1,Objectobj2)compare(Objectobj1,Objectobj2)Strings1=obj1.toString().toLow
22、erCase();Strings1=obj1.toString().toLowerCase();Strings2=obj2.toString().toLowerCase();Strings2=obj2.toString().toLowerCase();pareTo(s2);pareTo(s2);/程序的入口方法程序的入口方法程序的入口方法程序的入口方法publicstaticvoidmain(Stringpublicstaticvoidmain(Stringargsargs)StringStringstrMonthsstrMonths=One,Two,threeOne,Two,three,Fo
23、ur,five,SixFour,five,Six,Sevent,eight,NightSevent,eight,Night,Ten,eleven,TwelveTen,eleven,Twelve;/利用利用利用利用ArraysArrays类进行排序类进行排序类进行排序类进行排序Arrays.sort(strMonthsArrays.sort(strMonths););/getcountofmonths/getcountofmonthsintint nMonthLennMonthLen=strMonths.lengthstrMonths.length;/按照字母顺序进行排序按照字母顺序进行排序按照
24、字母顺序进行排序按照字母顺序进行排序for(for(intinti=0;ii=0;inMonthLennMonthLen;i+);i+)System.out.print(strMonthsiSystem.out.print(strMonthsi+);+);System.out.printlnSystem.out.println();();/用比较器进行构造用比较器进行构造用比较器进行构造用比较器进行构造Arrays.sort(strMonths,newArrays.sort(strMonths,newComp();Comp();for(for(intinti=0;ii=0;i=0;i-)des
25、t.append(source.charAt(i);returndest.toString();程序运行结果如下:程序运行结果如下:avaJevolI第六章第六章字符串处理字符串处理6.1String6.1String类类类类6.26.2StringBufferStringBuffer类类类类6.36.3StringTokenizerStringTokenizer类的应用类的应用类的应用类的应用6.46.4字符串与其他数据类型的转换字符串与其他数据类型的转换字符串与其他数据类型的转换字符串与其他数据类型的转换6.3StringTokenizer类类6.3.16.3.1构造方法构造方法构造方法构
26、造方法6.3.26.3.2StringTokenizerStringTokenizer类的常用方法类的常用方法类的常用方法类的常用方法6.3.1构造方法构造方法StringTokenizerStringTokenizer类提供三种形式的构造函数:类提供三种形式的构造函数:StringTokenizer(StringStringTokenizer(String strstr)StringTokenizer(StringStringTokenizer(String sbsb,StringStringdelimdelim)/)/delimdelim为分隔符号为分隔符号StringTokenizer(
27、StringStringTokenizer(String SbSb,StringStringdelimdelim,booleanboolean returnTokensreturnTokens)在对一个字符串进行解析的时候,在字符串中必须包括一个用于解析的分隔符号。在对一个字符串进行解析的时候,在字符串中必须包括一个用于解析的分隔符号。JavaJava置默认的分隔符为空格、制表符置默认的分隔符为空格、制表符(t)(t)、换行符、换行符(n)(n)、回车符、回车符(r)(r)。如。如果在程序计中想采用自定义的分隔符,可以通过在构造函数中指定果在程序计中想采用自定义的分隔符,可以通过在构造函数中指
28、定delimdelim项来设项来设置用户分隔符。相应地,在置用户分隔符。相应地,在StringTokenizerStringTokenizer类中提供了相应的成员方法:类中提供了相应的成员方法:另外,如果另外,如果 returnTokensreturnTokens 标志为标志为 true,true,则分隔符字符也被作为标记返回。每个分隔则分隔符字符也被作为标记返回。每个分隔符作为长度为一的字符串返回。如果标志为符作为长度为一的字符串返回。如果标志为 false,false,则跳过分隔符字符,且把它作则跳过分隔符字符,且把它作为标记之间的分隔符。为标记之间的分隔符。例如:例如:StringTok
29、enizerStringTokenizer fenxifenxi=new=newStringTokenizer(weStringTokenizer(wearestudent);arestudent);StringTokenizerStringTokenizer fenxifenxi=new=newStringTokenizer(weStringTokenizer(we,are;student,;);,are;student,;);6.3.26.3.2StringTokenizerStringTokenizer类的常用方法类的常用方法类的常用方法类的常用方法1 1统计分隔符数量统计分隔符数量统计
30、分隔符数量统计分隔符数量publicpublicintint countTokenscountTokens()()该方法返回的是字符串中的当前单词的数量,为整数。例如:该方法返回的是字符串中的当前单词的数量,为整数。例如:StringStringstrstr=new=newString(IString(IloveJava);loveJava);StringTokenizerStringTokenizer stst=new=newStringTokenizer(strStringTokenizer(str););intint nTokensnTokens=st.countTokensst.cou
31、ntTokens();/();/值为值为3 32 2匹配和寻找分隔符匹配和寻找分隔符匹配和寻找分隔符匹配和寻找分隔符通常,下面的两个组合方法均可以用来完成分隔符的寻找和匹配:通常,下面的两个组合方法均可以用来完成分隔符的寻找和匹配:hasMoreElementshasMoreElements()()、nextElementnextElement()()和和hasMoreTokenshasMoreTokens()()、nextTokennextToken()()、nextToken(StringnextToken(String delimdelim)一般是用一般是用hasMoreTokensha
32、sMoreTokens方法判断在字符串中是否还有已经定义的分隔符。如果有,方法判断在字符串中是否还有已经定义的分隔符。如果有,除分隔符后、到下一个分隔符之前的内容进行一次循环。如果没有则终止循环。除分隔符后、到下一个分隔符之前的内容进行一次循环。如果没有则终止循环。下面的两个程序应用下面的两个程序应用hasMoreTokenshasMoreTokens()()、nextTokennextToken()()方法来寻找方法来寻找StringString对象中的分对象中的分隔符。隔符。6.3.26.3.2StringTokenizerStringTokenizer类的常用方法类的常用方法类的常用方法
33、类的常用方法【例例例例6-56-5】利用利用StringTokenizerStringTokenizer类进行简单词法分析类进行简单词法分析/TestToken.javaTestToken.javaimportimportjava.utiljava.util.*;.*;publicclasspublicclassTestTokenTestToken publicstaticvoidpublicstaticvoidmain(Stringmain(String argsargs)/构造构造StringTokenizerStringTokenizer对象对象StringTokenizerString
34、Tokenizer stst=new=newStringTokenizerStringTokenizer(thisisaJavaprogramming);(thisisaJavaprogramming);/在字符串中匹配默认的分隔符在字符串中匹配默认的分隔符while(st.hasMoreTokenswhile(st.hasMoreTokens()()/打印当前分隔符和下一分隔符之间的内容打印当前分隔符和下一分隔符之间的内容System.out.println(st.nextTokenSystem.out.println(st.nextToken();();程序运行结果如下程序运行结果如下th
35、isisaJavaProgramming第六章第六章字符串处理字符串处理6.1String6.1String类类类类6.26.2StringBufferStringBuffer类类类类6.36.3StringTokenizerStringTokenizer类的应用类的应用类的应用类的应用6.46.4字符串与其他数据类型的转换字符串与其他数据类型的转换字符串与其他数据类型的转换字符串与其他数据类型的转换6.46.4字符串与其他数据类型的转换字符串与其他数据类型的转换字符串与其他数据类型的转换字符串与其他数据类型的转换6.4.16.4.1其他数据转换为字符串其他数据转换为字符串其他数据转换为字符串
36、其他数据转换为字符串6.4.26.4.2字符串转化成其他数据字符串转化成其他数据字符串转化成其他数据字符串转化成其他数据6.4.1其他数据转换为字符串其他数据转换为字符串String类中提供了静态方法valueOf(),用来把不同类型的简单数据转化为字符串。申明格式如下:publicstaticStringvalueOf(booleanb)publicstaticStringvalueOf(charc)publicstaticStringvalueOf(chardata)publicstaticStringvalueOf(chardata,intoffset,intcount)publicst
37、aticStringvalueOf(doubled)publicstaticStringvalueOf(floatf)publicstaticStringvalueOf(longl)publicstaticStringvalueOf(Objectobj)6.4.1其他数据转换为字符串其他数据转换为字符串【例例6-7】将简单数据转换成字符串publicclassCovertStringpublicstaticvoidmain(Stringargs)intnInt=10;floatfFloat=3.14f;doubledDouble=3.1415926;/转换为整型Integerobj1=newI
38、nteger(nInt);/转换为浮点数类型Floatobj2=newFloat(fFloat);/转换为双精度类型Doubleobj3=newDouble(dDouble);/分别调用toString方法转换为字符串StringstrString1=obj1.toString();System.out.println(strString1);StringstrString2=obj2.toString();System.out.println(strString2);StringstrString3=obj3.toString();System.out.println(strString3)
39、;n nimportimportjava.utiljava.util.*;.*;classA1classA1publicstaticvoidpublicstaticvoidmain(Stringmain(String argsargs)Calendarc=Calendarc=Calendar.getInstanceCalendar.getInstance();();c.setTime(newc.setTime(newDate();Date();Stringy=Stringy=String.valueOf(c.get(Calendar.YEARString.valueOf(c.get(Calen
40、dar.YEAR),),m=String.valueOf(c.get(Calendar.MONTH)+1);m=String.valueOf(c.get(Calendar.MONTH)+1);System.out.printlnSystem.out.println(现在的时间是:现在的时间是:现在的时间是:现在的时间是:););System.out.println(ySystem.out.println(y+年年年年+m+m+月月月月););System.out.print(c.get(Calendar.YEARSystem.out.print(c.get(Calendar.YEAR););S
41、ystem.out.print(c.get(Calendar.MONTH)+1);System.out.print(c.get(Calendar.MONTH)+1);6.4.2字符串转化成其他数据字符串转化成其他数据同时,类Integer、Double、Float和Long中也提供了方法valueOf()把一个字符串转化为对应的数字对象类型。其申明格式如下:publicstaticDoublevalueOf(Strings)throwsNumberFormatExceptionpublicstaticIntegervalueOf(Strings)throwsNumberFormatExcept
42、ionpublicstaticFloatvalueOf(Strings)throwsNumberFormatExceptionpublicstaticLongvalueOf(Strings)throwsNumberFormatExceptionpublicstaticDoublevalueOf(Strings)throwsNumberFormatException特别注意的是,若该String不能作为相应数据类型对象的转换,则抛出异常。用户可以调用Integer、Double、Long、Float类中的ValueOf方法将字符串转换为相应的封装数据类型,进而转换为简单数据类型。6.4.2字符串
43、转化成其他数据字符串转化成其他数据Double、Float、Integer、Long等类都提供了doubleValue(),floatValue(),intValue(),longValue()等方法将对象转换成其他简单数据类型的方法。例如:StringstrPI=”3.1415926”;Doubledpi=Double.valueOf(strPI);doubleddPI=dpi.doubleValue();floatffPI=dpi.floatValue();同时Boolean、Byte、Double、Float、Integer、Long等类也分别提供了静态方法parseDouble(Str
44、ing)、parseFloat(String)、parseInt(String)、parseLong(String)等方法将对象转换成其他简单数据类型的方法。其方法声明格式如下:staticbooleanparseBoolean(Strings)staticintparseInt(Strings,intradix)staticbyteparseByte(Strings)staticdoubleparseDouble(Strings)staticfloatparseFloat(Strings)6.4.2字符串转化成其他数据字符串转化成其他数据【例例6-8】将字符串转换为相应的简单数据类型。将字符
45、串转换为相应的简单数据类型。publicclassCovertSimplepublicstaticvoidmain(Stringargs)charcArray;intnInt;floatfFloat;doubledDouble;StringstrString=newString(IloveJava);StringstrInteger=newString(314);StringstrFloat=newString(3.14);StringstrDouble=newString(3.1416);cArray=strString.toCharArray();System.out.println(cArray);nInt=Integer.parseInt(strInteger);System.out.println(nInt);fFloat=Float.parseFloat(strFloat);System.out.println(fFloat);dDouble=Double.parseDouble(strDouble);System.out.println(dDouble);上面程序的输出为:上面程序的输出为:IloveJava3143.143.1416