Java基础知识-对象数组及二维数组.ppt

上传人:牧羊曲112 文档编号:6509724 上传时间:2023-11-07 格式:PPT 页数:72 大小:344.50KB
返回 下载 相关 举报
Java基础知识-对象数组及二维数组.ppt_第1页
第1页 / 共72页
Java基础知识-对象数组及二维数组.ppt_第2页
第2页 / 共72页
Java基础知识-对象数组及二维数组.ppt_第3页
第3页 / 共72页
Java基础知识-对象数组及二维数组.ppt_第4页
第4页 / 共72页
Java基础知识-对象数组及二维数组.ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《Java基础知识-对象数组及二维数组.ppt》由会员分享,可在线阅读,更多相关《Java基础知识-对象数组及二维数组.ppt(72页珍藏版)》请在三一办公上搜索。

1、第2章 对象数组及二维数组,课程回顾:OO:属性+行为特性:封装+继承+多态,第2章 对象数组及二维数组,Java基础知识变量、数据类型、判定语句、循环语句,第2章 对象数组及二维数组,用数组存储对象 对数组元素进行排序 在已排序的数组中查找 二维数组,数组元素可以是任何类型(只要所有元素具有相同的类型)数组元素可以是基本数据类型数组元素也可以是类对象,称这样的数组为对象数组。在这种情况下,数组的每一个元素都是一个对象的引用。,用数组存储对象,例如,BankAccount accounts;或BankAccount accounts;定义了一个存储BankAccount类对象的数组。与C、C+

2、不同,Java在数组的定义中并不为数组元素分配内存,因此 中不需指明数组中元素的个数,即数组长度,而且对于如上定义的数组是不能引用的,必须经过初始化才可以引用。,用数组存储对象,对象数组的初始化分为静态初始化和动态初始化静态初始化:在定义数组的同时对数组元素进行初始化,例如:BankAccount accounts=new BankAccount(“Zhang,100.00),new BankAccount(“Li,2380.00),new BankAccount(“Wang,500.00),new BankAccount(“Liu,175.56),new BankAccount(“Ma,92

3、4.02);,用数组存储对象,动态初始化:使用运算符new为数组分配空间,对于基本类型的数组,其格式如下:type arrayName=new typearraySize;type arrayName=new typearraySize;对于对象数组,使用运算符new只是为数组本身分配空间,并没有对数组的元素进行初始化。即数组元素都为空,如图。,数组元素未初始化的对象数组,用数组存储对象,此时不能访问数组的任何元素,必须对数组元素进行初始化后,才能访问。因此,对于对象数组,需要经过两步空间分配。首先给数组分配空间:type arrayName=new typearraySize;然后给每一个数

4、组元素分配空间:arrayName0=new type(paramList);arrayNamearraySize-1=new type(paramList);,用数组存储对象,例如:/定义一个String类型的数组String stringArrar;/给数组stringArray分配3个引用空间,每个引用值为null。stringArray=new String3;/下面给数组元素分配空间stringArray0=new String(“how”);stringArray1=new String(“are”);stringArray2=new String(“you”);,用数组存储对象,

5、当给数组元素分配了内存空间后,就可以引用了。数组元素的引用方式为:arrayNameindexindex为数组下标,下标从0开始,一直到数组长度减1。下标可以是整型常数或表达式。Java对数组元素要进行越界检查以保证安全性。同时,对于每个数组都有一个属性length指明它的长度(这里即是数组元素的个数)。例如,stringArray.length指明数组stringArray的长度。,用数组存储对象,对象数组应用举例,使用数组对一个班的学生信息及考试成绩进行存储,学生信息包括学号、姓名、三门课(英语、数学、计算机)的成绩及总成绩。,用数组存储对象,首先定义学生类Student:属性包括:学号(

6、id),姓名(name),英语成绩(eng),数学成绩(math),计算机成绩(comp),总成绩(sum)。方法包括:构造方法,get方法,set方法,toString方法,equals方法,compare方法(比较两个学生的总成绩,结果分大于,小于,等于),sum方法(计算总成绩)。为了能够将Student类对象直接存储,应使其加入串行化协议。代码如下:,用数组存储对象,/Student.javaimport java.io.*;public class Studentimplements Serializableprivate String id;/学号private String na

7、me;/姓名private int eng;/英语成绩private int math;/数学成绩private int comp;/计算机成绩private int sum;/总成绩,用数组存储对象,/构造方法public Student(String id,String name,int eng,int math,int comp)this.id=id;this.name=name;this.eng=eng;this.math=math;p=comp;sum();/计算总成绩,用数组存储对象,/构造方法public Student(Student s)this.id=s.id;this.n

8、ame=new String(s.name);this.eng=s.eng;this.math=s.math;p=p;sum();/计算总成绩,用数组存储对象,/set方法public void setId(String id)this.id=id;public void setName(String name)this.name=name;public void setEng(int eng)this.eng=eng;sum();/计算总成绩,用数组存储对象,/set方法public void setMath(int math)this.math=math;sum();/计算总成绩publi

9、c void setComp(int comp)p=comp;sum();/计算总成绩,用数组存储对象,/get方法public String getId()return id;public String getName()return name;public int getEng()return eng;public int getMath()return math;,public int getComp()return comp;public int getSum()return sum;,用数组存储对象,/计算总成绩void sum()this.sum=eng+math+comp;/to

10、String方法public String toString()return getId()+t+getName()+t+getEng()+t+getMath()+t+getComp()+t+getSum();,用数组存储对象,/比较两个Student对象的值是否相等public boolean equals(Object x)if(this.getClass()!=x.getClass()return false;Student b=(Student)x;return(this.getId().equals(b.getId();,用数组存储对象,/比较成绩大小,当前对象成绩比参数对象成绩大时

11、返回1,/相等时返回0,其它返回-1.public int compare(Student A)if(this.getSum()A.getSum()return 1;else if(this.getSum()=A.getSum()return 0;else return-1;,用数组存储对象,下面定义班级类StudentClass:属性包括:班级名称(name),容量(capacity),学生(students),实际人数(size)。方法包括:构造方法,get方法,set方法,toString方法。,用数组存储对象,/StudentClass.java/定义学生班级类StudentClass

12、public class StudentClassprivate String name;/班级名称static int capacity=40;/最大容量private Student students;/学生private int size;/实际人数,用数组存储对象,/构造方法public StudentClass(String name,int size)this.name=name;this.size=size;students=new Studentcapacity;,用数组存储对象,/get方法public String getName()return name;public i

13、nt getCapacity()return capacity;public Student getStudents()return students;public int getSize()return size;,用数组存储对象,/set方法public void setName(String name)this.name=name;public void setCapacity(int capacity)this.capacity=capacity;public void setSize(int size)this.size=size;public void setStudents(St

14、udent students)for(int i=0;isize;i+)this.studentsi=new Student(studentsi);,用数组存储对象,/toString方法public String toString()String s;s=班级:+name+t+容量:+capacity+t+实际人数:+size+nn;s=s+学号+t+姓名+t+英语+t+数学+t+计算机+t+总成绩n;for(int i=0;isize;i+)s=s+studentsi.getId()+t+studentsi.getName()+t+studentsi.getEng()+t+students

15、i.getMath()+t+studentsi.getComp()+t+studentsi.getSum()+n;return s;,用数组存储对象,定义测试类Tester1:为测试简单,仅生成具有5名学生的班级,5名学生的信息从键盘输入,为了避免以后再重复输入,可将输入的学生信息保存到文件中。,用数组存储对象,import java.io.*;public class Tester1public static void main(String args)Student students;StudentClass aClass=new StudentClass(软件06,5);students

16、=new Student5;for(int i=0;i5;i+)studentsi=new Student(getAStudent(i+1);aClass.setStudents(students);System.out.println(aClass);,用数组存储对象,/将学生信息保存到文件stu.ser中。try FileOutputStream fo=new FileOutputStream(stu.ser);ObjectOutputStream so=new ObjectOutputStream(fo);for(int i=0;i5;i+)so.writeObject(students

17、i);so.close();catch(Exception e)System.out.println(e);,用数组存储对象,/从键盘输入一个学生的信息public static Student getAStudent(int i)Student studenti;System.out.println(输入第+i+个学生的信息:);System.out.print(学号:);String id=Keyboard.getString();System.out.print(姓名:);String name=Keyboard.getString();System.out.print(英语成绩:);i

18、nt eng=Keyboard.getInteger();System.out.print(数学成绩:);int math=Keyboard.getInteger();System.out.print(计算机成绩:);int comp=Keyboard.getInteger();studenti=new Student(id,name,eng,math,comp);return studenti;,用数组存储对象,运行结果如下:输入第1个学生的信息:学号:250201姓名:李红英语成绩:88数学成绩:76计算机成绩:60输入第2个学生的信息:班级:软件06 容量:40 实际人数:5 学号 姓名

19、 英语 数学 计算机 总成绩250201 李红 88 76 60 224250202 张林 78 67 80 225250203 董玉梅 86 80 75 241250204 张力 70 68 75 213250205 何为 80 90 78 248Press any key to continue.,用数组存储对象,在班级类StudentClass中增加常用方法:如查找某个学生是否存在(find),增加一个学生(add),删除一个学生(del)等。,用数组存储对象,(1)查找已知学生的学号,查找此学生是否存在。如果存在,返回其在数组中的下标位置;如果不存在,返回-1。顺序查找方法的代码如下:

20、/顺序查找 public int find(String id)for(int i=0;i size;i+)if(studentsi.getId().equals(id)return i;return-1;,用数组存储对象,(2)增加下面的方法是在数组的末尾增加一个学生对象。/增加一个学生 public boolean add(Student aStudent)if(size=capacity)return false;/没有空间,不能增加if(find(aStudent.getId()=0)return false;/此学号已存在,不能增加/增加操作this.studentssize=new

21、 Student(new String(aStudent.getId(),new String(aStudent.getName(),aStudent.getEng(),aStudent.getMath(),aStudent.getComp();size+;return true;,用数组存储对象,(3)删除已知一个Student对象,将此对象从数组中删除。/删除一个学生public boolean del(Student aStudent)int pos=find(aStudent.getId();if(pos=-1)return false;/此学号不存在,不能删除/将此学生从数组中删除.

22、/将数组元素studentspos+1.studentssize-1依次向前移动一个位置,且size的值减1.for(int i=pos+1;isize;i+)studentsi-1=studentsi;size-;return true;,用数组存储对象,/已知学号,删除一个学生public boolean del(String id)int pos=find(id);if(pos=-1)return false;/此学号不存在,不能删除/将此学生从数组中删除./将数组元素studentspos+1.studentssize-1依次向前移动一个位置,且size的值减1.for(int i=p

23、os+1;isize;i+)studentsi-1=studentsi;size-;return true;,用数组存储对象,编写测试类Tester2:对新增加的查找、增加及删除方法进行测试。,用数组存储对象,/Tester2.javaimport java.io.*;public class Tester2 public static void main(String args)Student students=new Student5;/从文件stu.ser中读出学生信息。try FileInputStream fi=new FileInputStream(stu.ser);ObjectI

24、nputStream si=new ObjectInputStream(fi);for(int i=0;i5;i+)studentsi=(Student)si.readObject();si.close();,用数组存储对象,catch(Exception e)System.out.println(e);StudentClass aClass=new StudentClass(软件04,5);aClass.setStudents(students);System.out.println(aClass);/查找,增加,删除测试for(int i=0;i2;i+)System.out.print(

25、输入查找的学号);String id=Keyboard.getString();if(aClass.find(id)0)System.out.println(不存在!);else System.out.println(存在!);,用数组存储对象,for(int i=0;i2;i+)Student aStudent=getAStudent(6+i);if(aClass.add(aStudent)System.out.println(增加成功!);else System.out.println(不能增加!);for(int i=0;i2;i+)System.out.print(输入要删除的学号);

26、String id=Keyboard.getString();if(aClass.del(id)System.out.println(已删除!);else System.out.println(“不存在!”);System.out.println(aClass);,用数组存储对象,按照预先规定的准则(如升序或降序等),把数据有次序地排列起来的操作称为“排序”或“分类”(Sorting)。目前已经设计出许多排序算法,常用的排序算法有选择排序、插入排序及交换排序等。,对数组元素进行排序,(1)选择排序选择排序的基本思想是先在未排序序列中选一个最小元素,作为已排序子序列,然后再重复地从未排序子序列中

27、选取一个最小元素,把它加到已经排序的序列中,作为已排序子序列的最后一个元素,直到把未排序子序列中的元素处理完为止。,对数组元素进行排序,例 用选择排序方法将例1中生成的文件stu.ser中的班级学生按总成绩从高到低排序。在前例中的StudentClass类中增加选择排序方法selectionSort:/用选择排序方法将总成绩按从高到低排序public void selectionSort()Student temp;for(int i=0;i0)temp=studentsi;studentsi=studentsj;studentsj=temp;,对数组元素进行排序,/SortTester.ja

28、va测试排序方法import java.io.*;public class SortTesterpublic static void main(String args)Student students=new Student5;/从文件stu.ser中读出学生信息。try FileInputStream fi=new FileInputStream(stu.ser);ObjectInputStream si=new ObjectInputStream(fi);for(int i=0;i5;i+)studentsi=(Student)si.readObject();si.close();catc

29、h(Exception e)System.out.println(e);,对数组元素进行排序,StudentClass aClass=new StudentClass(软件06,5);aClass.setStudents(students);System.out.println(aClass);/选择排序aClass.selectionSort();System.out.println(选择排序后的结果:n);System.out.println(aClass);运行结果如下:,对数组元素进行排序,班级:软件0201 容量:40 实际人数:5学号 姓名 英语 数学 计算机 总成绩250201

30、李红 88 76 60 224250202 张林 78 67 80 225250203 董玉梅 86 80 75 241250204 张力 70 68 75 213250205 何为 80 90 78 248选择排序后的结果:班级:软件0201 容量:40 实际人数:5学号 姓名 英语 数学 计算机 总成绩250205 何为 80 90 78 248250203 董玉梅 86 80 75 241250202 张林 78 67 80 225250201 李红 88 76 60 224250204 张力 70 68 75 213Press any key to continue.,对数组元素进行排

31、序,(2)插入排序 先以未排序数列的第一个元素作为已排序子数列,然后从原来的第二个元素起,将各元素逐一插入到已排序子数列中合适的位置,直到把全部元素都插入为止。,对数组元素进行排序,(2)插入排序 假设数组a中有n个元素a0、a1、an-1,则可以按照某种属性对其进行排序。按照直接插入法,首先要把a0作为已排序子数列。然后逐一将a1、a2、an-1插入到已排序子数列中。每插入一个元素ai都要执行如下两步操作:,对数组元素进行排序,(2)插入排序第一步,在已排序子数列中找一个合适位置j,使ajai,并且aiaj+1。第二步,将ai插入到aj之后。将aj+1、依次向后移一位(后移操作也可在第一步的

32、查找过程中进行)。,对数组元素进行排序,例3 直接插入排序举例。根据上面的算法,在StudentClass中增加直接插入排序方法insertSort,代码如下:/直接插入排序方法public void insertSort()Student temp;for(int i=1;i-1,对数组元素进行排序,顺序查找的算法简单,但在大数据量中进行查找时效率较低。在未排序的数组中进行查找,只能使用顺序查找方法。对于已排序的数组,也可以使用顺序查找方法,但可以对算法进行一定的改进,使其效率有所提高。,在已排序的数组中查找,例如,有一批Integer类型的数据已按升序排列好。a1a2an这批数据存储在数组

33、a0、a1、an-1中,现在要对该数组进行查找,看给定的数据x是否在此数组中。由于数组中的元素已按升序排列,因此,在查找时,x不需要与数组中的每个元素都进行比较。假如按从左向右的顺序查找,当x小于ai时就应该停止查找。改进的顺序查找方法如下:,在已排序的数组中查找,public int seqSearch(int x)for(int i=0;(i=ai.intValue();i+)if(ai.intValue()=x)return i;return-1;,在已排序的数组中查找,对于已排序的数组,还可以使用效率更高的查找方法,比较典型的方法有二分查找。同样是上面的问题,可以用下面的方法:在0到n

34、-1中间选一个正整数k,用k把原来的有序数列分为三个有序子序列:I1:a0,a1,ak-1I2:akI3:ak+1,ak+2,an-1,在已排序的数组中查找,然后,用ak与x比较,若x等于ak,查找结束;若x小于ak,则用同样的方法把序列a0,a1,ak-1分成三个序列;若xak,也用同样的方法把序列ak+1,ak+2,an-1分成三个序列,这样每分一次,要查找的范围就缩小一半。这个过程进行下去,直到找到x,或查找的范围内已没有数据(这种情况说明x不存在)。这是一种应用分治策略的解题思想。当k=1/2 时,称为二分查找法,或二分检索法。,在已排序的数组中查找,例 二分查找举例。下面定义具有排序

35、数组的类SortedIntArray。其中,search方法运用二分查找算法在给定的数组范围内查找某一元素,如果存在,返回元素所在的下标位置,如果不存在,则返回元素应该在的位置。将此功能与插入功能相结合,又可实现对数组元素进行排序。,在已排序的数组中查找,public class SortedIntArray private int capacity;private Integer rep;private int size;/size 的缺省值为 0/构造方法public SortedIntArray(int n)capacity=n;rep=new Integercapacity;/无参的构

36、造方法 public SortedIntArray()this(100);,在已排序的数组中查找,/下面的方法运用二分查找算法在下标从lower到upper范围内的数组/元素中查找第一个不小于新元素的数组元素的下标。private int search(int i,int lower,int upper)int index=lower;if(upper=lower)int middle=(upper+lower)/2;int current=repmiddle.intValue();if(current=i)index=middle;else if(current i)index=search

37、(i,middle+1,upper);else index=search(i,lower,middle-1);return index;,在已排序的数组中查找,public int search(int i)return search(i,0,size-1);/在数组中插入一个元素。public SortedIntArray insert(int i)int index=search(i);for(int j=size;j index;-j)repj=repj-1;repindex=new Integer(i);+size;return this;,在已排序的数组中查找,/在数组中删除一个元素

38、。只删除查到的第一个元素。public SortedIntArray remove(int i)int index=search(i);if(repindex.intValue()=i)-size;for(int j=index;j size;+j)repj=repj+1;return this;public String toString()String toReturn=;for(int i=0;i size;+i)toReturn+=repi.toString()+,;return toReturn;,在已排序的数组中查找,/主方法static public void main(Stri

39、ng args)SortedIntArray anArray=new SortedIntArray();anArray.insert(4).insert(9).insert(7).insert(1).insert(3).insert(2).insert(8).insert(7);System.out.println(anArray);anArray.remove(1).remove(8).remove(7).remove(3);System.out.println(anArray);运行结果如下:,1,2,3,4,7,7,8,9,2,4,7,9,Press any key to continu

40、e.,在已排序的数组中查找,数组元素的类型除了可以是基本数据类型、类对象外,还可以是数组。前面介绍的数组也称为一维数组,如果一维数组的元素又是一维数组,则称此数组为二维数组。二维数组常用来表示二维表,即以行(rows)及列(columns)的方式组织数据。,二维数组,二维数组的定义方式如下:type arrayName;或type arrayName;与一维数组一样,这时还没有给数组分配空间;对于对象数组,还需要给数组元素分配空间。二维数组的初始化也分为静态和动态两种:,二维数组,静态初始化:在定义数组的同时为数组分配空间。如,int intArray=1,2,2,3,3,4;,二维数组,动态

41、初始化:对二维数组来说,分配内存空间有下面两种方法:一种方法是直接为每一维分配空间,格式如下:typearrayName=new typearraylength1arraylength2例如,int a=new int23;,二维数组,另一种方法是从最高维开始(而且必须从最高维开始),分别为每一维分配空间。例如,String s=new String2;s0=new String2;s1=new String3;s00=new String(Good);s01=new String(Luck);s10=new String(to);s11=new String(you);s12=new Str

42、ing(!);,二维数组,例5 编写程序建立并显示如图所示的二维表,并计算累加和最大的行号。设元素值都为正整数。,public class TableTester public static void main(String args)int myTable=23,45,65,34,21,67,78,46,14,18,46,98,63,88,98,81,64,90,21,14,23,54,43,55,76,22,43,33;,二维数组,/显示二维表 for(int row=0;row4;row+)for(int col=0;col7;col+)System.out.print(myTabler

43、owcol+“”);System.out.println();,二维数组,/计算累加和最大的行号 int sum,max,maxRow=0;max=0;for(int row=0;row max)max=sum;maxRow=row;System.out.println(Row+maxRow+has the highest sum of+max);,二维数组,运行结果如下:23 45 65 34 21 67 7846 14 18 46 98 63 8898 81 64 90 21 14 2354 43 55 76 22 43 33Row 2 has the highest sum of 391Press any key to continue.,二维数组,注意,多维数组的length属性只返回第一维的长度。如,int ages47;则ages.length返回的结果是4,而不是28。也可以分别存取每一维的长度。如,int ages=int ages47;int firstArray=ages0;则ages.length*firstArray.length的结果为28。,二维数组,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号