实验6 接口回调及集合类应用.docx
- 文档编号:7305329
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:21
- 大小:98.97KB
实验6 接口回调及集合类应用.docx
《实验6 接口回调及集合类应用.docx》由会员分享,可在线阅读,更多相关《实验6 接口回调及集合类应用.docx(21页珍藏版)》请在冰豆网上搜索。
实验6接口回调及集合类应用
深圳大学实验报告
课程名称:
JAVA程序设计
实验项目名称:
实验六接口回调及集合类应用
学院:
专业:
指导教师:
报告人:
学号:
班级:
实验时间:
2017年10月16日星期一
实验报告提交时间:
2017年10月21日星期六
一、实验目的与要求:
1.理解接口的概念,掌握接口回调的使用;
2.了解接口与抽象类的区别;
3.掌握接口的建立与使用;
4.熟悉集合类LinkedList<>、TreeSet<>、TreeMap<>、HashSet、HashMap等典型类的使用。
二、实验内容
1.(20分)MyCircle类继承实验3中的Circle类,增加了一个颜色的属性,同时实现Comparable接口,请在MyCircle类中定义一个静态方法求两个MyCircle中的较大者的max方法;编写测试程序,比较三个MyCircle对象的大小。
2.(10分)建立一个叫PrintColor的接口,接口中包含一个方法:
StringhowToPrint();
MyCircle类实现这个接口,在howToPrint方法中根据随机生成的一个数字,分别返回不同颜色的。
1
2
3
4
5
6
7
8
9
10
Red
Orange
Yellow
Green
Cyan
Blue
Purple
White
Black
Pink
3.(10分)编写应用程序,根据用户输入的两个日期,计算两个日期之间间隔的天数。
注:
用户输入的日期格式为“××××年××月××日”。
4.(20分)张三、李四、陈六等人是A社团成员,李四、王五、蔡九等人是B社团成员,编写一个应用程序,使用HashSet,输出参加A社团的人、参加B社团的人、同时参加两个社团的人、只参加A社团的人、只参加B社团的人。
5.(20分)有10个风扇,其属性有半径大小(整型)和价格(浮点型)。
编写一个应用程序,使用TreeMap
要求分别通过两种方式实现:
通过实现Comparator接口和通过实现Comparable接口。
6.(20分)一个科研问题中需要实现两个浮点矩阵的乘法,这两个矩阵的行、列规模非常大,同时这个矩阵中有超过99%的元素为0,其他元素为浮点数。
请编写一个Java应用程序,实现具有上述特点的矩阵乘法,要求使用HashMap。
三、实验过程及结果
第一题
代码如下:
packagecom.bingo.test;
importjava.util.Arrays;
importjava.util.Scanner;
publicclassTest1{
publicstaticvoidmain(String[]args){
MyCircle[]mc=newMyCircle[3];
Scannersc=newScanner(System.in);
doubleradius=0;
Stringcolor=null;
for(inti=0,len=mc.length;i System.out.printf("\n请输入第[%d]个圆的信息: \n",i+1); System.out.print("半径: "); radius=sc.nextDouble(); System.out.print("颜色: "); sc.nextLine(); color=sc.nextLine(); mc[i]=newMyCircle(radius,color); } Arrays.sort(mc); System.out.println("三个MyCircle对象从小到大的顺序为: "); for(MyCirclemyCircle: mc){ System.out.println(myCircle); } } } classCircle{ publicstaticfinaldoublePI=Math.PI; privatedoubleradius; publicCircle(doubleradius){ this.radius=radius; } publicvoidsetRadius(doubleradius){ this.radius=radius; } publicdoublegetRadius(){ returnradius; } publicdoublecalCircumference(){ return2*PI*radius; } publicdoublecalArea(){ returnPI*radius*radius; } publicbooleancompareCircle(Circlec){ returnthis.radius>c.radius; } @Override publicStringtoString(){ return"Circle[radius="+radius+"]"; } } classMyCircleextendsCircleimplementsComparable{ privateStringcolor; publicMyCircle(doubleradius,Stringcolor){ super(radius); this.color=color; } @Override publicintcompareTo(Objecto){ MyCirclemc=(MyCircle)o; returncompareCircle(mc)? 1: -1; } //重写了compareTo()方法,此max()方法可不写 publicstaticMyCirclemax(MyCirclemc1,MyCirclemc2){ returnpareTo(mc2)>0? mc1: mc2; } publicStringtoString(){ return"MyCircle[radius="+this.getRadius()+",color="+color+"]"; } } 运行效果截图如下: 第二题 代码如下: packagecom.bingo.test; importjava.util.Random; importjava.util.Scanner; publicclassTest2{ publicstaticvoidmain(String[]args){ System.out.println("请输入MCircle的个数: "); Scannersc=newScanner(System.in); intnum=sc.nextInt(); MCircle[]mc=newMCircle[num]; System.out.println("随机生成的MCircle颜色如下: "); for(MCirclemCircle: mc){ mCircle=newMCircle(); System.out.println(mCircle.howToPrint()); } } } //定义PrintColor接口 interfacePrintColor{ publicabstractStringhowToPrint(); } //实现PrintColor接口 classMCircleimplementsPrintColor{ @Override publicStringhowToPrint(){//重写接口中的howToPrint()方法 Randomr=newRandom(); String[]colors={ "", "Red", "Orange", "Yellow", "Green", "Cyan", "Blue", "Purple", "White", "Black", "Pink" }; inti=r.nextInt(10)+1; //利用Random产生1-10之间的随机数 returncolors[i]; //把随机数当成数组索引,返回对应的颜色 } } 运行效果截图如下: 第三题 代码如下: packagecom.bingo.test; importjava.text.ParseException; importjava.text.SimpleDateFormat; importjava.util.Date; importjava.util.Scanner; publicclassTest3{ publicstaticvoidmain(String[]args)throwsParseException{ System.out.println("本程序用于计算两日期之间间隔的天数,日期输入格式为: xxxx年xx月xx日"); inttimes=3; while((times--)>0){ Scannersc=newScanner(System.in); SimpleDateFormatsdf=newSimpleDateFormat("yyyy年MM月dd日"); System.out.println("请输入第一个日期: "); Stringdate1=sc.nextLine(); Dated1=sdf.parse(date1); System.out.println("请输入第二个日期: "); Stringdate2=sc.nextLine(); Dated2=sdf.parse(date2); System.out.println("两日期相差: "+calcDays(d1,d2)+"天"); System.out.println("-----------------"); } } //calcDays()方法用于计算两日期之间的天数 publicstaticintcalcDays(Dated1,Dated2){ longs=d1.getTime()-d2.getTime(); if(s<0){//比较两日期毫秒值大小 s*=-1; } intd=(int)(s/1000/60/60/24); returnd; } } 运行效果截图如下: 第四题 代码如下: packagecom.bingo.test; importjava.util.HashSet; publicclassTest4{ publicstaticvoidmain(String[]args){ //社团A HashSet hs1.add("张三"); hs1.add("李四"); hs1.add("陈六"); //社团B HashSet hs2.add("王五"); hs2.add("李四"); hs2.add("蔡九"); System.out.print("参加A社团的人有: "); traverse(hs1); System.out.print("\n参加B社团的人有: "); traverse(hs2); System.out.print("\n同时参加AB社团的人有: "); bothAB(hs1,hs2); System.out.print("\n只参加A社团的人有: "); onlyOne(hs1,hs2); System.out.print("\n只参加B社团的人有: "); onlyOne(hs2,hs1); } privatestaticvoidonlyOne(HashSet for(Stringstring: hs1){ if(! hs2.contains(string)){ System.out.print(string+""); } } } publicstaticvoidtraverse(HashSet for(Stringstring: hs){ System.out.print(string+""); } } publicstaticvoidbothAB(HashSet for(Stringstring: hs2){ if(hs1.contains(string)){ System.out.print(string+""); } } } } 运行效果截图如下: 第五题 代码如下: packagecom.bingo.test; importjava.util.Comparator; importjava.util.Random; importjava.util.TreeMap; publicclassTest5{ publicstaticvoidmain(String[]args){ //测试程序 demo1(); demo2(); } privatestaticvoiddemo2(){ System.out.println("---------实现Comparator接口,并重写compare()方法---------"); System.out.println("数据已重新生成! "); System.out.println("按价格从小到大输出风扇信息如下: "); TreeMap //按价格从小到大 @Override publicintcompare(Fanf1,Fanf2){ intnum=(int)(f1.getPrice()-f2.getPrice()); returnnum==0? 1: num; } //按半径从小到大 /*@Override publicintcompare(Fanf1,Fanf2){ intnum=(int)(f1.getRadius()-f2.getRadius()); returnnum==0? 1: num; }*/ }); Randomr=newRandom(); for(inti=0;i<10;++i){ intradius=r.nextInt(4)+3; intprice=r.nextInt(4)+3; tm.put(newFan(radius,price),"风扇"); } for(Fanfan: tm.keySet()){ System.out.println(fan); } } privatestaticvoiddemo1(){ System.out.println("---------实现Comparable接口,并重写compareTo()方法---------"); System.out.println("按半径从大到小输出风扇信息如下: "); TreeMap Randomr=newRandom(); for(inti=0;i<10;++i){ //随机产生风扇半径和价格,控制在3-6 intradius=r.nextInt(4)+3; intprice=r.nextInt(4)+3; tm.put(newFan(radius,price),"风扇"); } //遍历输出风扇信息 for(Fanfan: tm.keySet()){ System.out.println(fan); } } } //实现Comparable接口方式,并重写compareTo()方法 classFanimplementsComparable{ privateintradius; privatefloatprice; publicFan(intradius,floatprice){ super(); this.radius=radius; this.price=price; } publicintgetRadius(){ returnradius; } publicfloatgetPrice(){ returnprice; } @Override publicStringtoString(){ return"Fan[radius="+radius+",price="+price+"]"; } //按价格从小到大 /* @Override publicintcompareTo(Objecto){ Fanf=(Fan)o; intnum=(int)(price-f.getPrice()); returnnum==0? 1: num; } */ //按半径从大到小输出 @Override publicintcompareTo(Objecto){ Fanf=(Fan)o; intnum=(int)(f.getRadius()-radius); returnnum==0? 1: num; } } 运行结果截图如下: 第六题 代码如下: packagecom.bingo.test; importjava.util.HashMap; importjava.util.Scanner; importjava.util.Set; publicclassTest6{ publicstaticvoidmain(String[]args){ System.out.println("-------该程序用于计算两稀疏矩阵相乘-------"); Scannersc=newScanner(System.in); //准备相乘的两个矩阵 Matrix[]m=newMatrix[2]; for(inti=0;i<2;++i){ System.out.println("请输入第"+(i+1)+"个矩阵的行数、列数、非零个数(以空格隔开)"); introw=0,col=0,num=0; while(true){ row=sc.nextInt(); col=sc.nextInt(); num=sc.nextInt(); //排除“行数<1、列数<1、非零个数大于所有矩阵元素个数”的情况 if(! (row<1||col<1||num>row*col)){ break; } System.out.println("输入错误,请重新输入! "); } m[i]=newMatrix(row,col,num); for(intj=1;j<=num;++j){ System.out.println("请输入第"+j+"个非零元素的行号、列号、值"); intx=0,y=0; floatval=0; while(true){ x=sc.nextInt(); y=sc.nextInt(); val=sc.nextFloat(); if(! (x<1||x>m[i].getRowNum()||y<1||y>m[i].getColNum())){ break; } System.out.println("输入错误,请重新输入! "); } m[i].setValue(x,y,val); } System.out.println(); } MatrixresultMatrix=Matrix.multiply(m[0],m[1]); if(resultMatrix! =null){ System.out.println("\n-------相乘后的矩阵信息如下-------"); resultMatrix.printMatrix(); } } } //记录非零元素的下标,并将Index对象作为HashMap的键 classIndex{ intx; inty; publicIndex(intx,inty){ this.x=x; this.y=y; } } classMatrix{ privateintcolNum
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验6 接口回调及集合类应用 实验 接口 集合 应用