《JAVA(数组向量字符串).ppt》由会员分享,可在线阅读,更多相关《JAVA(数组向量字符串).ppt(86页珍藏版)》请在三一办公上搜索。
1、,第四讲 数组、向量和字符处理,1、数组2、向量3、字符处理,主要内容,1、数组,一维数组(1)一维数组的定义一维数组的定义方式为:type arrayName;其中类型type可以为Java中任意的数据类型,包括简单类型和复合类型。数组名arrayName为一个合法的标识符,指明该变量是一个数组类型变量。例如:int intArray;声明了一个一维的整型数组变量intArray。,与C、C+不同,Java在数组的定义中并不为数组元素分配内存,因此 中不用指出数组中元素的个数,即数组长度,而且对于如上定义的一个数组是不能访问它的任何元素的。必须经过初始化后,才能使用数组的元素。,除了这种定义
2、数组的方式之外,java语言还提供了其它的定义形式,如下所示:type arrayName;对于以上举出的例子,我们也可以这样定义:int intArray;int intArray;,(2)一维数组的初始化 一维数组变量定义之后,必须经过初始化才可以引用。数组的初始化分为静态初始化和动态初始化两种:静态初始化:在定义数组的同时对数组元素进行初始化,例如:int intArray=1,2,3,4;/定义了一个含有4个元素的int型数组。,动态初始化:使用运算符new为数组分配空间,对于简单类型的数组,其格式如下 type arrayName=new typearraySize;或:type a
3、rrayName=new typearraySize;如:int x=new int100;double y=new double200;,例如:int IntArrar;/定义一个int类型的数组变量,给变量IntArrar分配 1个存储空间,初始化为nullIntArrar=new int3;/申请3个int类型的存储空间,并将首地址赋给变量IntArrarIntArrar0=10;IntArrar1=20;IntArrar2=30;,给数组元素赋值,简单类型数组分配内存示意图,IntArrar,0 xb1ca,IntArrar0 IntArrar1 IntArrar2,0 xb1ca,1
4、02030,IntArrar=new int3;,对于复合类型(类、接口、数组)的数组,需要经过两步空间分配。首先:type arrayName=new typearraySize;然后:arrayName0=new type(paramList);arrayName1=new type(paramList);arrayNamearraySize-1=new type(paramList);,例如:String stringArrar;/定义一个String类型的数组变量stringArray=new String3;/给数组变量StringArray分配 3个连续的存储空间,初始化每个引用值
5、为nullstringArray0=new String(“how”);stringArray1=new String(“are”);stringArray2=new String(“you”);,初始化各数组元素,复合类型数组分配内存示意图,stringArrar,oxa2b6,how,StringArrar0StringArrar1StringArrar2,oxa2b6,0 xb1ca,are,0 xd3ca,you,0 xa5c7,0 xb1ca0 xd3ca0 xa5c7,(3)一维数组的引用 当定义了一个数组,并用运算符new为它分配了内存空间后,就可以引用数组中的每一个元素了。元素
6、的引用方式为:arrayNameindex index为数组下标,可以是整型常数或表达式,如:arrayName1,arrayNamei,arrayName6*i等。下标从0开始,一直到数组长度减1。,另外,与C、C+中不同,Java对数组元素要进行越界检查以保证安全性。同时,对于每个数组,都有一个属性length指明它的长度,例如:intArray.length指明数组intArray的长度。,数组举例,public class ArrayTest public static void main(String args)int i;int a=new int5;for(i=0;i=0;i-)
7、System.out.println(a+i+=+ai);,该程序对数组中的每个元素赋值,然后按逆序输出。,运行结果为:a4=4a3=3 a2=2 a1=1a0=0,(4)课堂练习a、Fibonacci数列 F1=F2=1;Fn=Fn-1+Fn-2(n=3)b、冒泡排序法对数组中的元素进行比较,每次把最小的元素交换到最前面,最后使得整个数组按从小到大顺序排列。,1、数组,多维数组 在任何语言中,多维数组都被看作数组的数组。比如二维数组是一个特殊的一维数组,其每一个元素又是一个一维数组。我们主要以二维数组为例来说明,高维数组与此类似。,(1)二维数组的定义方式 type arrayName;例如
8、:int intArray;也可以采用另一种定义方式:int intArray;二维数组与一维数组一样,这时对数组元素也没有分配内存空间,同样要使用运算符new来分配内存,然后才可以访问每个元素。,(2)二维数组的初始化 二维数组的初始化也分为静态和动态两种。静态初始化:在定义数组的同时为数组分配空间int intArray=1,2,2,3,3,4;不必指出数组每一维的大小,系统会根据初始化时给出的初始值的个数自动算出数组每一维的大小。,简单二维数组内存分配示意图,float x;,x,null,x=new float3;,x,0 xab12,nullnullnull,x0=new int2;
9、x1=new int3;x2=new int4;,x,0 xab12,x0,x1,x2,x0,x1,x2,动态初始化:对高维数组来说,分配内存空间有下面两种方法:1.直接为每一维分配空间,如:type arrayName=new typearraylength1arraylength2;例如:int a=new int23;,2.从最高维开始(而且必须从最高维开始),分别为每一维分配空间,如:String s=new String2;s0=new String2;s1=new String2;s00=new String(“Good”);s01=new String(“Luck”);s10=n
10、ew String(“to”);s11=new String(“you”);,请画出二维数组内存分配示意图,(3)二维数组的引用 对二维数组中每个元素,引用方式为:arrayNameindex1index2 其中index1和index2为数组下标,为整型常数或表达式,都是从0开始的。(4)二维数组举例 两个矩阵相乘,参照参考书在课余时间上机练习。,例题,class ErweiShuzu public static void main(String arg)int a=new int3;int i,j;a0=new int2;a1=new int3;a2=new int4;for(i=0;ia
11、.length;i+)for(j=0;jai.length;j+)aij=i+j;System.out.print(aij+”);System.out.println();,double x=new double3;x0=new double2;x1=new double3;x0=new double5;x00=5;x11=9;x23=7;,总共有14个变量,其中x、x0、x1、x2是引用变量,其余是简单变量。,x00 x01,String x=new String3;x0=new String2;x1=new String3;x0=new String5;x01=new String(“ab
12、cd”);,总共有14个变量,都是引用变量。x00到x24这10个引用变量可以存放字符串的地址。,2、向量,向量(Vector)是java.util类包提供的一个工具类。它对应于类似数组的顺序存储的数据结构,但是具有比数组更强大的功能。它是允许不同类型元素共存的变长数组。每个Vector类的对象可以表达一个完整的数据序列。Vector类的对象不但可以保存顺序的一列数据,而且还提供了许多有用的方法来操作和处理这些数据。另外,Vector类对象所表达的序列中元素的个数是可变的,即Vector实现了变长数组。,2、向量,Java中的数组只能保存固定数目的元素,且必须把所有需要的内存单元一次性的申请出
13、来,而不能先创建数组再追加数组元素数量,为了解决这个问题Java中引入了向量类Vector。Vector也是一组对象的集合,但相对于数组,Vector可以追加对象元素数量,可以方便的修改和维护序列中的对象。,向量比较适合在如下情况下使用:1.需要处理的对象数目不定,序列中的元素都是对象或可以表示为对象 2.需要将不同类的对象组合成一个数据序列 3.需要做频繁的对象序列中元素的插入和删除 4.经常需要定位序列中的对象和其他查找操作 5.在不同的类之间传递大量的数据 Vector类的方法相对于数组要多一些,但是使用这个类也有一定的局限性,例如其中的对象不能是简单数据类型等。,(1)创建向量类的对象
14、 Vector类有三个构造方法:Vector():构造一个空的向量。Vector(int capacity):以指定的存储容量构造一个空的向量。Vector(int capacity,int capacityIncrement):以指定的存储容量和容量增量构造一个空的Vector。,2、向量,例如:Vector MyVector=new Vector(100,50);这个语句创建的MyVector向量序列初始有100个元素的空间,以后一旦使用殆尽则以50为单位递增,使序列中元素的个数变化成150,200,。在创建Vector序列时,不需要指明序列中元素的类型,可以在使用时确定。,(2)向向量序
15、列中添加元素:有两种添加元素的方法:addElement(Object obj)将新元素添加到序列尾部。insertElementAt(Object obj,int index)将新元素插入到指定位置。,2、向量,2、向量,下面是使用这两种方法的例子:,Vector MyVector=new Vector();for(int i=1;i=10;i+)MyVector.addElement(new Integer(i);MyVector.insertElementAt(middle,5);,import java.util.*;class aapublic static void main(St
16、ring arg)Vector MyVector=new Vector();for(int i=1;i=10;i+)MyVector.addElement(new Integer(i);MyVector.insertElementAt(middle,5);for(int i=0;i=10;i+)System.out.println(MyVector.elementAt(i);/main/class,例题,运行结果:12345middle678910,2、向量,(3)修改或删除向量序列中的元素使用以下方法修改或删除向量序列中的元素:1.setElementAt(Object obj,int in
17、dex)将向量序列index位置处的对象元素设置成为obj,如果这个位置原来有元素,则被覆盖。2.removeElement(Object obj)删除向量序列中第一个与指定的obj对象相同的元素,同时将后面的元素前提,补上空位。这个方法返回的是布尔值。3.removeElementAt(int index)删除index指定位置处的元素,同时将后面的元素前提。,2、向量,4.removeAllElements()清除向量序列中的所有元素。下例中先创建一个Vector,再删除掉其中的所有字符串对象“to”。,Vector MyVector=new Vector(100);for(int i=0
18、;i10;i+)MyVector.addElement(“welcome”);MyVector.addElement(“to”);MyVector.addElement(“beijing”);while(MyVector.removeElement(“to”);,2、向量,(4)查找向量序列中的元素 常用于查找向量序列中某元素的方法如下:1.Object elementAt(int index)返回指定位置处的元素。一个要注意的问题:由于返回的是Object类型的对象,在使用之前通常需要进行强制类型转换,将返回的对象引用转换成Object类的某个具体子类的对象。例如:String str=(S
19、tring)MyVector.elementAt(0);2.boolean contains(Object obj)检查向量序列中是否包含指定的对象元素obj。,2、向量,3.int indexOf(Object obj,int start_index)从指定的start_index位置开始向后搜索,返回所找到的第一个与指定对象obj相同的元素的下标位置。若指定的对象不存在,则返回1。4.int lastIndexOf(Object obj,int start_index)从指定的start_index位置开始向前搜索,返回所找到的第一个与指定对象obj相同的元素的下标位置。若指定的对象不存在
20、,则返回1。例如:,int i=0;While(i=MyVector.indexOf(“welcome”,i)!=-1)System.out.println(i);i+;,2、向量,(5)Vector中的其他方法capacity():返回Vector的容量 clone():建立Vector的备份copyInto(Object):把Vector中的元素拷贝到一个数组中firstElement():返回第一个元素lastElement():返回最后一个元素isEmpty():判断是否为空setSize(int size):设置Vector的大小size():返回Vector中元素的数量trimTo
21、Size():将Vector的容量下调至最小值,2、向量,使用Vector时,一个需要特别注意的问题就是要先创建后使用。如果不先使用new运算符利用构造函数创建Vector类的对象,而直接使用Vector的方法,如:addElement()等方法,则可能造成堆栈溢出或使用null指针等异常,妨碍程序的正常运行。,例题:用向量实现,创建3个学生对象(学号、姓名、年龄)和4个教师对象(教工号、姓名、系别),并且输出。,import java.util.*;class StuString xh;String xm;int nl;public Stu(String xh1,String xm1,int
22、 nl1)xh=xh1;xm=xm1;nl=nl1;void disp()System.out.println(学生:+xh+xm+nl);,class TechString zh;String xm;String xb;public Tech(String zh1,String xm1,String xb1)zh=zh1;xm=xm1;xb=xb1;void disp()System.out.println(教师:+zh+xm+xb);,public class StuTerpublic static void main(String s)Vector st=new Vector();st.
23、addElement(new Stu(101,李明,18);st.addElement(new Stu(102,王大力,20);st.addElement(new Stu(103,刘萍,19);st.addElement(new Tech(10100,林小利,计算机);st.addElement(new Tech(10101,熊平,计算机);st.addElement(new Tech(10102,戴红兵,电力);st.addElement(new Tech(10103,曲小军,电力);,for(int i=0;ist.size();i+)if(st.elementAt(i)instanceo
24、f Stu)(Stu)(st.elementAt(i).disp();else(Tech)(st.elementAt(i).disp();,3、字符串,字符串是字符的序列,它是组织字符的基本数据结构,从某种程度上来说有些类似于存放字符的数组。在Java中,字符串被当作对象来处理。程序中需要用到的字符串可以分为两大类。一类是创建之后不会再做修改和变动的字符串常量;另一类是创建之后允许再做更改和变化的字符串变量。对于字符串常量,由于程序中经常需要对它做比较、搜索之类的操作,所以通常把它放在一个具有一定名称的对象之中,由程序对该对象完成上述操作。,在Java中,存放字符串常量的对象用String类,
25、对于字符串变量,由于程序中经常需要对它做添加、插入、修改等操作,一般存放在StringBuffer类的对象中。,String类创建的对象存放的是字符串常量StringBuffer类创建的对象存放的是字符串变量,(1)字符串的表示 1.字符串常量 字符串常量使用双引号括住的一串字符,比如:Hello world!Java编译器自动为每一个字符串常量生成一个String类的实例,因此可以用字符串常量直接初始化一个String对象,如:String s=Hello world!;,2.创建字符串常量String对象 要创建类String的一个对象并进行初始化,需要调用类String的构造方法。类St
26、ring中提供了下面的一些构造方法:String():无参数的缺省的构造方法用来创建一个空串。String s=new String();String(String value):利用已经存在的字符串常量创建一个新的String对象,该对象的内容与给出的字符串常量一致。String s=new String(“hello”);或:String s=“hello”;,String(char value):通过给构造方法传递一个字符数组,可以创建一个非空串。char chars=a,b,c;String s=new String(chars);String(char value,int start
27、Index,int numChars):这种方法用来创建一个非空串,并且指明所创建的字符串在字符数组中的起始地址以及所包含的字符个数。char chars=a,b,c,d,e,f;String s=new String(chars,2,3);该方法生成的串s为“cde”。(注意数组的下标从0开始),String(byte value,byte hibyte):因为在Internet上,格式采用八位的ASCII码,所以Java的类String提供了从byte型数组进行初始化的构造方法。其中hibyte指明各字符的高位字节,对于通常所用的ASCII码,必须将高位字节声明为零,而其他的非拉丁文字符则
28、置为非零。byte bytestr=97,98,99;String s=new String(bytestr,0);该方法构造的字符串s是“abc”。,String(byte value,byte hibyte,int startIndex,int numChars):这种构造方法与String(char value,int startIndex,int numChars)类似,只是初始化的数组类型不同。byte bytestr=80,81,82,83,84,85;String s=new String(bytestr,0,2,3);该方法构造的字符串s是“RST”。String(String
29、Buffer buffer):这个构造函数利用一个已经存在的StringBuffer对象为新建的String对象初始化,(2)字符串的基本方法 1.length public int length()此方法返回字符串的字符个数,如:String s=abc;System.out.println(s.length();则将显示字符个数为3。,3、字符串,2.charAt public char charAt(int index)该方法返回字符串中index位置上的字符,其中index值的范围是0length-1。,3、字符串,3.getChars如果要从字符串中提取一个以上的字符,则可以用此方法
30、:public void getchars(int srcbegin,int end,char buf,int dstbegin)其中,srcbegin为要提取的第一个字符在源串中的位置,end为要提取的最后一个字符在源串中的位置,字符数组buf存放目的字符串,dstbegin为提取的字符串在目的串中的起始位置。,3、字符串,4.getbytespublic void getbytes(int srcbegin,int end,byte byt,int dstbegin)类似于上一个方法,只是串中的字符均用8位表示,参数及用法同上。,3、字符串,5.indexOf和lastIndexOf为了在
31、给定的字符串中检索特定的字符或子串,类String提供了上面两种方法,并通过方法重写更方便的处理这类问题。这两种方法中,如果查找成功,则返回匹配成功的字符的位置,如果没有查找到,则都返回-1。int indexOf(int ch)int lastIndexOf(int ch)返回字符ch在字符串中出现的第一个和最后一个位置。,3、字符串,int indexOf(String str)int lastindexOf(String str)返回子串str中第一个字符在字符串中出现的始末位置。int indexOf(int ch,int fromIndex)int lastIndexOf(int c
32、h,int fromIndex)返回字符ch在字符串中位置fromIndex以后出现的始末位置。int indexOf(String str,int fromIndex)int lastIndexOf(String str,int fromIndex)返回子串str中的第一个字符在字符串中位置fromIndex以后出现的始末位置。,3、字符串,6.在Java中,运算符“”可以用来实现字符串的连接,如:String s=“He is”+age+”years old.”假设整数型变量age的值为15,那么,s的值为“He is 15 yearsOld”。pareTopublic int compa
33、reTo(String str)该方法按字典次序比较两个字符串的大小,如果源串较小,则返回一个小于0的值,如相等则返回0,否则返回一个大于0的值。,3、字符串,8.regionMatchesboolean regionMatches(int toffset,String other,int ooffset,int len)boolean regionMatches(boolean ignoreCase,int toffset,String other,int ooffset,int len)上述两个方法都是用来进行模式匹配的,匹配成功则返回true,否则返回false。其中,toffset和o
34、offset分别指明当前字符串和参数字符串中所要比较的子串的起始索引位置,len指明比较的长度,而ignoreCase指明比较时是否区分大小写。对于第一种方法,比较是区分大小写的。,3、字符串,9.equals和equalsIgnoreCasepublic boolean equals(object str)public boolean equalsIgnoreCase(object str)判断两个字符串是否相等,相等则返回 true,不等则返回false,两种方法的区别在于 equalsIgnoreCase不区分字母大小写,而equals则须区分。10.其他方法public String
35、concat(String str);将当前字符串对象与给定的字符串str连接起来,3、字符串,public String replace(char oldChar,char newChar)将串中出现的特定字符用新的字符代替。public String substring(int beginIndex)public String substring(int beginIndex,int endIndex)用来得到字符串中指定范围内的子串。public String toLowerCase()把串中的所有字符转换成小写。public String toUpperCase()把串中的所有字符转换
36、成大写。,字符串的应用,class StringCopyModify public static void main(String args)String s=new String(We will go further to modify a String by copy!);System.out.println(From String+s+);String sub1=s.substring(20);String sub2=s.substring(0,19);System.out.println(“Get a sub string from index 20 to the end:+sub1)
37、;System.out.println(“Get a sub string from index 0 to 19:+sub2);String cons=sub2.concat(sub1);System.out.println(“Concat two sub string into one:n+cons);,运行结果为:,From String“We will go further to modify a String by copy”Get a sub string from index 20 to the end:to modify a String by copyGet a sub str
38、ing from index 0 to 19:We will go furtherConcat two sub strings into one:We will go further to modify a String by copy,3、字符串,(3)类StringBuffer 构造方法 StringBuffer()建立一个空串的缓冲区,长度为16。StringBuffer(int length)建立一个长度为length的空串缓冲区。StringBuffer(String str)初始化缓冲区内容为给定的字符串str,并提供另16个字符的空间供再次分配。,3、字符串,基本方法 除了方法l
39、ength(),charAt(),getChars()以外,还有以下几种方法。1.capacity public int capacity()此方法返回字符串缓冲区的长度,即总的可供分配的字符个数。,class demoOfStringBuffer public static void main(String buf)StringBuffer sb=new StringBuffer(abc);System.out.println(buffer=+sb);System.out.println(length=+sb.length()System.out.println(capacity=+sb.c
40、apacity();,运行结果:buffer=abclength=3capacity=19,从运行结果我们可以看到为附加处理保留了空间。注意:capacity()与length()的区别。,3、字符串,2.append public StringBuffer append(对象类型 对象名)append方法将指定的参数对象转化成字符串,附加在原来的字符串对象之后。3.insert public StringBuffer insert(int 插入位置,对象类型 对象名)在指定的位置插入给出的参数对象所转化而得的字符串。,3、字符串,4.setChatAt()public void setCha
41、rAt(int index,char ch)用来设置指定索引index位置的字符值。5.setLength public void setLength(int newLength)如果希望明确地定义字符缓冲区的长度,则可以用此方法。如果newlength大于现在的长度,串尾将补0,如果小于,那么newlength后的字符将丢失。,(4)Java与C和C+处理字符串的差别 1.C和C+的字符串只是简单的以0结尾的字符数组,而Java中,字符串是一个封装的对象,这种处理对于编程者提供了许多有利之处。2.C和C+中可以通过指针直接对字符串所在的内存地址进行操作,并且不对越界情况进行检查,Java中只
42、能通过类String或StringBuffer所提供的方法对字符串进行操作,并且要对越界情况进行检查并报告,这样大大增加了安全性。,(4)Java与C和C+处理字符串的差别3.由于类String和StringBuffer的方法都已明确说明,所以我们可以预知Java中字符串处理的功能;而在C和C+中,只有通过库函数或者自定义函数对字符串进行处理。,下一节课的内容:异常处理,主要包括以下内容:1、例外的概念2、例外的分类3、捕获例外4、声明例外5、抛出例外6、创建自己的例外,例题,class erweishuzu/分析运行结果 public static void main(String arg)
43、int a=new int3;int i,j;a0=new int2;a1=new int3;a2=new int4;for(i=0;ia.length;i+)for(j=0;jai.length;j+)aij=i+j;System.out.print(aij+”);System.out.println();,运行结果:0,11,2,3,2,3,4,5,,0 1,1 2 3,2 3 4 5,a,a0,a1,a2,a、a0、a1、a2中存放的是地址。,求二维数组的鞍点(行中最大,列中最小)。class AnDianpublic static void main(String arg)int a=
44、2,4,3,8,9,1,3,5,4,17,2,6,1,4,10;int max,min,i,j,k,m;,for(i=0;imax)max=aij;m=j;,min=aim;for(k=0;k3;k+)/找列中的最小值 if(akmmin)min=akm;if(max=min)/判断最大和最小是否相等 System.out.println(第+(i+1)+行有鞍点,是+aim);else System.out.println(“第”+(i+1)+“行没有鞍点。”);/,运行结果:第1行有鞍点,是9。第2行没有鞍点。第3行没有鞍点。,2,4,3,8,91,3,5,4,172,6,1,4,10,c
45、lass zcfpublic static void main(String arg)String str1=12abc56rg;String str2=sfabc16;int i,j,k;,找两个字符串出现的相同子串。,for(i=1;i=str1.length();i+)/子串的长度 for(j=0;j=str1.length();j+)for(k=0;k=str2.length();k+)/判断str1中的子串是否在str2中出现 if(str1.regionMatches(j,str2,k,i)System.out.println(str1.substring(j,j+i);/截取子串
46、,Str1:12abc56rgStr2:sfabc16,运行结果:1abc6abbcabc,String str1=12abc56rg;String str2=sfabc16;,如何从键盘上读取数据,import java.util.*;class InputKeyBoard public void inputInt()/用空格做分隔符如:1 2 3#回车 Scanner s=new Scanner(System.in);/用逗号做分隔符,如:1,2,3,#,回车/Scanner s=new Scanner(System.in).useDelimiter(s*,s*);while(s.hasNextInt()int a=s.nextInt();System.out.println(a);s.close();,作业:1.用数组实现,创建3个学生对象(学号、姓名、年龄)和4个教师对象(教工号、姓名、系别),并且输出。(数据从键盘输入)2.编程实现判断字符串1是否在字符串2中出现,如果出现,则用字符串3替换。如:串1:563ty23tyio 串2:ty 串3:abc 结果:563abc23abcio3.用二维数组实现,5个学生7门课程的总分和平均分的统计工作。(要求用两个类实现),