第五章数组【实验目的】(1)掌握一维、二维数组的定义及初始化方法(2)掌握循环结构域数组相结合解决问题的方法(3)理解数组下标和数组元素间的关系(4)掌握List类的使用方法【实验范例】1、静态数组(1)数组例1:(一维数组)输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。importjava.util.*;publicclassProg1{publicstaticvoidmain(String[]args){intdigital=0;intcharacter=0;intother=0;intblank=0;char[]ch=null;Scannersc=newScanner(System.in);Strings=sc.nextLine();ch=s.toCharArray();//将字符串转换成字符数组for(inti=0;ich.length;i++){if(ch[i]='0'&&ch[i]='9'){digital++;}elseif((ch[i]='a'&&ch[i]='z')||ch[i]'A'&&ch[i]='Z'){character++;}elseif(ch[i]==''){blank++;}else{other++;}}System.out.println(数字个数:+digital);System.out.println(英文字母个数:+character);System.out.println(空格个数:+blank);System.out.println(其他字符个数:+other);}}例2:(二维数组)求一个3*3矩阵对角线元素之和。importjava.util.Scanner;publicclassProg1{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);int[][]number=newint[3][3];System.out.println(请输入9个整数:);for(inti=0;i3;i++){for(intj=0;j3;j++){number[i][j]=scanner.nextInt();}}System.out.println(输入的3*3矩阵是:);for(inti=0;i3;i++){for(intj=0;j3;j++){System.out.print(number[i][j]+);}System.out.println();}intsum=0;for(inti=0;i3;i++){for(intj=0;j3;j++){if(i==j){sum+=number[i][j];}}}System.out.println(矩阵的对角线元素之和为:+sum);}}2、列表类(动态数组)系统常用类:(1)列表类:ArrayList、Vector、LinkedList三个类均实现了List接口,前两者是实现了数组结构,后者是链表结构。ArrayList和Vector的区别:Vector支持多线程同步,但效率较低。(也就是说两个线程同时修改Vector会抛出异常)List集合常用方法:add、clear、contains、get、isEmpty、remove、size、toArrayArrayList类常用方法:Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange、ToArrayArrayList继承自List,故ArrayList可使用List方法注:要实现队列、栈,一般会使用LinkedList例3:使用ArrayListimportjava.util.*;publicclassProg1{publicstaticvoidmain(Stringargs[]){Listlist=newArrayList();//此处ArrayList类实现了List接口,下面可直接使用List接口的方法list.add(a);//添加元素list.add(b);list.add(c);System.out.print(原来列表为:);for(inti=0;ilist.size();i++){System.out.print(list.get(i));}System.out.println();System.out.println(list[0]=+list.get(0));//取第0个元素list.remove(0);//删除元素System.out.print(删除后列表为:);for(inti=0;ilist.size();i++){System.out.print(list.get(i));}System.out.println();System.out.println(size=+list.size());//显示列表大小}}例4:使用LinkedList实现队列、栈的功能importjava.util.*;publicclassProg1{publicstaticvoidmain(String[]args){LinkedListl=newLinkedList();l.add(one);l.add(two);l.add(three);l.add(four);l.add(five);System.out.println(l);//队列l.addLast(six);//相当于入队列的Push操作l.removeFirst();//相当于出队列的Get操作System.out.println(l);//栈l.removeLast();//相当于出栈的Pop操作l.removeLast();l.addLast(seven);//相当于入栈的Push操作System.out.println(l);}}凡涉及List类排序的问题,需要构造一个比较器Comparator,告诉编译器用什么方式来比较,构造器的构造可参照下述程序的代码。另外,例5中的泛型语法,只能使用Java1.5以上的编译器版本,对于Java1.5以下的版本,只能通过构造类(Class)来实现实现比较器Comparator,具体请参照例6。开启Java1.5版本的编译器方法:“菜单”--“项目”--“属性”--“Java编译器”--选择JDK1.5以上版本例5:(List类的比较器Comparator构造问题。使用泛型构造,只适用于Java1.5以上版本)使用List类,建立2条整数类型的序列,并将它们合并、去重复。importjava.util.*;publicclassProg1{publicstaticvoidmain(String[]args){ListIntegerlist1=newArrayListInteger();//泛型语法,只能够Java1.5以上使用ListIntegerlist2=newArrayListInteger();list1.add(1);list1.add(2);list1.add(3);list1.add(8);list2.add(3);list2.add(4);list2.add(5);list2.add(6);ListIntegerlist=newArrayListInteger();list.addAll(list1);list.addAll(list2);System.out.println(list);//构造比较器Collections.sort(list,newComparatorInteger(){publicintcompare(Integero1,Integero2){returno1-o2;}});System.out.println(list);for(inti=1;ilist.size();i++){if(list.get(i)==list.get(i-1)){list.remove(i);}}System.out.println(list);}}注:下面例子(例6)涉及“第七章类和对象”内容,故可先看完第七章再看下面例子。例6:使用比较器(使用类构造比较器,适用于所有版本)使用List建立学生(类)的列表,并使用学生(类)的属性:.name,.age分别排序。(使用List的.sort方法,即便是简单的数据类型,都要封装成Object类型)importjava.util.*;classStudent{privateStringname;privateintage;publicStudent(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}}publicclassProg1{publicstaticvoidmain(String[]args){Studentzlj=newStudent(丁晓宇,21);Studentdxy=newStudent(赵四,22);Studentcjc=newStudent(张三,11);Studentlgc=newStudent(刘武,19);//ListStudentstudentList=newArrayListStudent();//只能在Java1.5以上版本使用ListstudentList=newArrayList();studentList.add(zlj);studentList.add(dxy);studentList.add(cjc);studentList.add(lgc);Collections.sort(studentList,newSortByAge());for(Iteratoriter=studentList.iterator();iter.hasNext();){Studentst=(Student)iter.next();System.out.println(st.getName()+/+st.getAge());}System.out.println(=);Collections.sort(studentList,newSortByName());for(Iteratoriter=studentList.iterator();iter.hasNext();){Studentst=(Student)iter.next();System.out.println(st.getName()+/+st.getAge());}}}classSortByAgeimplementsComparator{//年龄比较器publicintcompare(Objecto1,Objecto2){Students1=(Student)o1;Students2=(Student)o2;if(s1.getAge()s2.getAge())return1;return0;}}classSortByNameimplementsComparator{//姓名比较器publicintcompare(Objecto1,Objecto2){Students1=(Student)o1;Students2=(Student)o2;returns1.getName().compareTo(s2.getName());}}(2)迭代器:Iterator遍历列表类也可以使用迭代器,Iterator类常用方法:hasNext(),Next()例7:importjava.util.*;publicclassProg1{publicstaticvoidmain(String[]args){Listl=newArrayList();l.add(aa);l.add(bb);l.add(cc);//迭代器用于for