java关于泛型的实验代码_[ Java学习 ] 泛型类的应用实验
成文原因:
这篇文章是我这周所做的 Java 实验题的一个小总结。
这次实验让我深刻赞同了我们 Java 老师在这节实验课前告诉我们的话:
最重要的是把问题想明白,它要怎么拆分成几个类,每个类里究竟需要哪些方法,具体细节怎么实现。当你真正把这些问题想清楚了以后,剩下的编程,其实就是很简单的事情了。难度往往不是难在编程,而是分解问题为一个个小问题后,逐一解决它们的能力。
做完实验以后再来看老师这句话,觉得不能同意更多。
我贴上来的代码有两份。
前一份是未完成的代码,之所以未完成,是因为:写到一半时,觉得这样的结构设计太不合理了,如果照着这么写下去,会有许多重复的代码片段不断地出现,于是就想着这么去改进…怎样才能尽可能减少方法,但是提高代码的复用性呢?
于是,果断放弃了前一种没写完的,不太优的结构,第二份代码才是写完时真正提交的最终版本。
除了代码,我把实验报告的心得部分也一并贴了上来用以自警
-------------------------------下面是实验题目------------------------------
-------------------------------下面是代码------------------------------
/*
前一份是未完成的代码,之所以未完成,是因为:写到一半时,觉得这样的结构设计太不合理了,如果照着这么写下去,会有许多重复的代码片段不断地出现,于是就想着这么去改进…怎样才能尽可能减少方法,但是提高代码的复用性呢?
于是,果断放弃了前一种没写完的,不太优的结构,第二份代码才是写完时真正提交的最终版本。
*/
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.*;
class Customer
{
private String name;
private String fNum; // flight number,表示他所定的航线的航线号
private int sum; //买了多少票
Customer()
{
}
Customer(String n, String f, int s)
{
name = n;
fNum = f;
sum = s;
}
public void setName(String n)
{
name = n;
}
public String getName()
{
return name;
}
public void setSum(int s)
{
sum = s;
}
public int getSum()
{
return sum;
}
public void setfNum(String f)
{
fNum = f;
}
String getfNum()
{
return fNum;
}
}
class Flight
{
private static int sum = 0; //航线计数
private int order; //航线排列号
private String destination;//终点站名
private String FNum; //航班号
private int limit; //乘客限额
private int free; //余票数量
private LinkedList booked; //已预定客户列表
private LinkedList waiting; //等候替补客户名单
Flight()
{
}
Flight(int o, String d, String F, int l)
{
order = o;
destination = d;
FNum = F;
limit = l;
}
public int getOrder()
{
return order;
}
public String getDestination()
{
return destination;
}
public String getFNum()
{
return FNum;
}
public int getLimit()
{
return limit;
}
public int getFree()
{
return free;
}
public void addFree(int f)
{
free += f;
}
public void subFree(int f)
{
free -= f;
}
public LinkedList getBooked()
{
return booked;
}
public LinkedList getWaiting()
{
return waiting;
}
public void showInfo() //show information
{
System.out.println("航线排列号为:" + order + " 终点站为:" + destination);
System.out.println("航班号为:" + FNum + " 成员定额为: " + limit + " 剩余票数为: " + free);
System.out.println("已订票客户有:");
Iterator it = booked.iterator();
for (; it.hasNext(); )
{
System.out.println(it.next().getName() + " ");
}
System.out.println();
System.out.println("等候替补客户有:");
for ( it = waiting.iterator(); it.hasNext(); )
{
System.out.println(it.next().getName() + " ");
}
System.out.println();
}
}
class Menu
{
private ArrayList flights;
Flight temp;
public void init()
{
Flight f = new Flight(1, "北京","K2", 20);
flights.add(f);
f = new Flight(2, "北京","K3", 23);
flights.add(f);
f = new Flight(3, "成都","K4", 25);
flights.add(f);
}
public void addFlight(Flight flight) //加入一条航线
{
flights.add(flight);
}
public void query() //查询
{
Scanner in = new Scanner(System.in);
int order = in.nextInt(); //次序
Flight temp;
Iterator it = flights.iterator();
for ( ; it.hasNext(); )
{
temp = it.next();
if (temp.getOrder() == order)
{
temp.showInfo();
return;
}
}
System.out.println("没有检索到相关信息");
}
public void book() //订票
{
System.out.println("请输入航班号,您的姓名,以及您想要订购的票数");
Scanner in = new Scanner(System.in);
Flight temp;
String tp, tp1; //tp 为航班号,tp1为姓名
int tem; // temporary
tp = in.next();
tp1 = in.nextLine();
tem = in.nextInt();
Customer c = new Customer(tp1, tp, tem); //构造函数参数依次为:姓名、 航线号、 所购票数
Iterator it = flights.iterator();
Flight temp;
for ( ; it.hasNext(); )
{
temp = it.next();
if (temp.getFNum() == tp)
{
if (temp.getFree() >= tem)
{
temp.subFree(tem);
temp.getBooked().add(c);
System.out.println("购票成功");
}
else
{
temp.getWaiting().add(c);
System.out.println("抱歉,票数暂时不够!");
}
return;
}
}
System.out.println("输入的航线不存在!");
}
public void cancel() //退票
{
System.out.println("请输入航班号,您的姓名,以及您想要退票的票数");
Scanner in = new Scanner(System.in);
Flight temp;
String tp, tp1; //tp 为航班号,tp1为姓名
int tem; // temporary
tp = in.next();
tp1 = in.nextLine();
tem = in.nextInt();
Iterator it = flights.iterator();
Flight temp;
for ( ; it.hasNext(); )
{
temp = it.next();
if (temp.getFNum() == tp) //确认航班号确实存在
{
for ( Iterator it2= temp.getBooked().iterator(); it2.hasNext(); )
{
Customer now = it2.next();
if (now.getName() == tp1 && now.getfNum() == tp) //确认该顾客确实定了该航班的机票
{
temp.addFree(tem);
System.out.println("退票成功");
if (now.getSum() == tem) //如果顾客将自己买的票全部退票,则从买票列表删除该顾客
temp.getBooked().remove(now);
}
}
for ( Iterator it2= temp.getWaiting().iterator(); it2.hasNext(); ) //遍历该航班的waiting列表,看是否有满足条件的购票请求可以满足
{
Customer now = it2.next();
if (now.getSum() <= temp.getFree())
}
}
}
System.out.println("输入信息有误");
}
public void menu() //显示菜单
{
System.out.println("----------");
System.out.println("1.航线查询");
System.out.println("2.办理退票");
System.out.println("3.办理退票");
System.out.println("4.退出系统");
System.out.println("----------");
Scanner in = new Scanner(System.in);
int order = in.nextInt(); //指令
switch(order)
{
case 1: query(); break;
case 2: book(); break;
case 3: cancel(); break;
case 4: System.exit(0); in.close();break;
default: System.out.println("输入错误,请 重新运行订票系统!");
}
menu();
}
}
public class test
{
public static void main(String args[] )
{
Menu m = new Menu();
m.menu();
}
}
//这份才是真正完整的,也是我提交的最终版本
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.*;
class Customer
{
private String name;
private String fNum; // flight number,表示他所定的航线的航线号
private int sum; //买了多少票
Customer()
{
}
Customer(String n, String f, int s)
{
name = n;
fNum = f;
sum = s;
}
public String getName()
{
return name;
}
public int getSum()
{
return sum;
}
public String getfNum()
{
return fNum;
}
public void setSum(int s)
{
sum = s;
}
}
class Flight
{
private static int sum = 0; //航线计数
private int order; //航线排列号
private String destination;//终点站名
private String FNum; //航班号
private int limit; //乘客限额
private int free; //余票数量
private LinkedList booked; //已预定客户列表
private LinkedList waiting; //等候替补客户名单
Flight()
{
}
Flight(int o, String d, String F, int l)
{
order = o;
destination = d;
FNum = F;
limit = free = l;
booked = new LinkedList();
waiting = new LinkedList();
}
public String getDestination()
{
return destination;
}
public String getFNum()
{
return FNum;
}
public void showInfo() //show information
{
System.out.println("航线排列号为:" + order + " 终点站为:" + destination);
System.out.println("航班号为:" + FNum + " 成员定额为: " + limit + " 剩余票数为: " + free);
System.out.println();
System.out.println("已订票客户有:");
Iterator it = booked.iterator();
for (; it.hasNext(); )
{
System.out.println(it.next().getName() + " ");
}
System.out.println();
System.out.println("等候替补客户有:");
for ( it = waiting.iterator(); it.hasNext(); )
{
System.out.println(it.next().getName() + " ");
}
System.out.println();
}
public void isbook(Customer c)
{
if (c.getSum() > free) //检验是否有足够余票可供该顾客订票
{
System.out.println("抱歉,票数暂时不足!");
waiting.add(c);
return;
}
book(c); //先判断可不可以订票,确认可以再订票
}
public void book(Customer c) //这个函数可重用,在退票以后,遍历 waiting 链表之前
{
for (Iterator it = booked.iterator(); it.hasNext(); ) //判断该顾客之前是否有订过该航班的票
{
Customer now = it.next();
if (now.getName().equals(c.getName()))
{
now.setSum(now.getSum() + c.getSum());
free -= c.getSum();
System.out.println("顾客" + c.getName() + "订票成功");
System.out.println("一共成功订票" + now.getSum() + "张,航班号为" + FNum );
return;
}
}
booked.add(c);
free -= c.getSum();
System.out.println("顾客" + c.getName() + "订票成功");
System.out.println("一共成功订票" + c.getSum() + "张,航班号为" + FNum );
}
public void cancel(Customer c)
{
Iterator it = booked.iterator();
boolean found = false;
for ( ; it.hasNext(); )
{
Customer now = it.next();
if (now.getName().equals(c.getName()))
{
found = true;
free += c.getSum();
System.out.println("退票成功");
if (now.getSum() == c.getSum())//如果顾客将自己买的票全部退票,则从买票列表删除该顾客
{
booked.remove(now);
break;
}
}
}
if (!found) System.out.println("退票失败,您没有定该航班的机票!");
System.out.println();
it = waiting.iterator();
for ( ; it.hasNext(); )
{
Customer now = it.next();
if (now.getfNum().equals(FNum) && now.getSum() <= free)
book(now);
}
}
}
class Menu
{
private ArrayList flights;
Flight temp;
public void init()
{
flights = new ArrayList();
Flight f = new Flight(1, "北京","k2", 20);
addFlight(f);
f = new Flight(2, "北京","k3", 23);
addFlight(f);
f = new Flight(3, "成都","k4", 25);
addFlight(f);
}
public void addFlight(Flight flight) //加入一条航线
{
flights.add(flight);
}
public void query() //查询
{
System.out.println("请输入要查询的目的地城市:");
Scanner in = new Scanner(System.in);
String d = in.next();
Flight temp;
Iterator it = flights.iterator();
boolean found = false;
for ( ; it.hasNext(); )
{
temp = it.next();
if (temp.getDestination().equals(d))
{
found = true;
temp.showInfo();
}
}
if (!found)System.out.println("没有检索到相关信息");
}
public void book() //订票
{
Scanner in = new Scanner(System.in);
System.out.println("请输入订票人数:");
int t = in.nextInt();
Flight temp; // 航班类临时变量
String tp, tp1; //tp 为航班号,tp1为姓名
int tem; // temporary
for (int i = 0; i < t; i++)
{
System.out.println("请输入航班号,您的姓名,以及您想要订购的票数");
tp = in.next();
tp1 = in.next();
tem = in.nextInt();
Customer c = new Customer(tp1, tp, tem); //构造函数参数依次为:姓名、 航线号、 所购票数
Iterator it = flights.iterator();
boolean found = false;
for ( ; it.hasNext(); )
{
temp = it.next();
if (temp.getFNum().equals(tp))
{
temp.isbook(c);
found = true;
break;
}
}
if (!found) System.out.println("输入的航线不存在!");
System.out.println();
}
}
public void cancel() //退票
{
Scanner in = new Scanner(System.in);
System.out.println("请输入退票人数:");
int t = in.nextInt();
Flight temp; // 航班类临时变量
String tp, tp1; //tp 为航班号,tp1为姓名
int tem; // temporary
for (int i = 0; i < t; i++)
{
System.out.println("请输入航班号,您的姓名,以及您想要退票的票数");
tp = in.next();
tp1 = in.next();
tem = in.nextInt();
Customer c = new Customer(tp1, tp, tem); //构造函数参数依次为:姓名、 航线号、 所购票数
Iterator it = flights.iterator();
boolean found = false;
for ( ; it.hasNext(); )
{
temp = it.next();
if (temp.getFNum().equals(tp)) //确认航班号确实存在
{
temp.cancel(c);
found = true;
break;
}
}
if (!found) System.out.println("输入信息有误");
System.out.println();
}
}
public void menu() //显示菜单
{
System.out.println("----------");
System.out.println("1.航线查询");
System.out.println("2.办理订票");
System.out.println("3.办理退票");
System.out.println("4.退出系统");
System.out.println("----------");
Scanner in = new Scanner(System.in);
int order = in.nextInt(); //指令
switch(order)
{
case 1: query(); break;
case 2: book(); break;
case 3: cancel(); break;
case 4: System.exit(0); in.close();break;
default: System.out.println("输入错误,请重新运行订票系统!");
}
menu();
}
}
public class test
{
public static void main(String args[] )
{
Menu m = new Menu();
m.init();
m.menu();
}
}
-------------------------------这些是实验心得体会------------------------------
五、心得体会(要详细,编程中碰到的问题及解决方案)
搜过的资料(都是超链接,可直接点击)
改进和思考:
1. 在写 Menu类 的 book() 和 cancel() 函数时,发现其实有大量重叠部分,因为 cancel() 函数在删除完以后,也是要遍历该航线的 Waiting列列表,看有没有 Customer 对象能够完成之前没能完成的订票。也就是说,book()函数里已经实现过的功能,还需要在 cancel()函数里在实现一次。
这样导致的结果,就是代码看上去又拖沓又冗长,于是想了个办法,在航班类里加入 book() 和 cancel() 函数,并且将 Customer类对象作为参数传到航班类里,这样就能直接调用 Flight 类的函数来完成订票退票,可以提高代码的复用性。
而且,如果传入 Customer类对象,那么,其实航班类的很多get函数都可以直接去掉了,一下子使代码简洁多了,看起来终于舒服多了,之前的一堆get函数很是拖沓…
从这个优化的过程感受到的就是:
不要急着敲代码,而是先想想能不能有更好的思路,比如这题,刚开始时就没有想到特别透彻清楚明白的程度,导致后来,实现函数的时候才发现,完全不用那么繁琐,明明有更简单的方法来实现,我为什么要弄得那么复杂?
所以,先别急着敲代码,而是应该先把每一个细节琢磨清楚,多问问自己:还能不能再简化一点?能不能再把代码写优美一点?一拿到题目就做,往往是最浪费时间的方法,因为后面用来修改和优化的时间会更多。我应该做的是,每次把所有优化的可能考虑周全,尽量把类里的方法减少到最少,同时提高这些方法的利用率,我觉得这才是实验里最为关键的部分。
2. 着手于简化、简化再简化
将不必要的get 和 set 函数都去掉,例如 Customer类,该题不考虑顾客改名的情况,故而不需要 name 的 set方法;此外,该题没有一个顾客同时买多个航线的飞机票的情况,就算真的要处理这种情况,按照我的代码设计的逻辑,也是要新建一个 Customer 对象的,因为我觉得这样做更方便处理。
再说详细一些就是,如果aaa同时买了 K2 和 K3 航班的票,那么,我打算采取的,不是将这这个航班的购票数都存在一个 Customer的对象里,而是打算再建立一个 Customer对象,保存 K3 的航班线名臣和K3的订票数。因为在办理订票和退票时,我们都是根据航班号来查航线的。如果把不同的航班号,存在同一个 Customer对象里,其实无形中加大了查找特定某航线的难度。
所以,照着这么说,航线名也是不会改的,如果这个顾客买的某个航线的票,全都被他自己后来退光了,那也只需要在那个航线的 booked 链表里删掉这个顾客的信息即可
这么想来,其实 fNum 的 set 方法也可以去掉,因为就本题的考虑,根本用不到这个方法。
唯一需要保留的 set 方法,是sum的set方法,因为可能存在退票但没有退完的情况,这时就需要改变 Customer对象的订票数了。
同理,对于 Flight 类,也应进行一次这样的考虑和排查。因为方法是为了解决问题而设计的,不是为了写一个方法而去写一个方法。所以,如果能更简单地解决问题,就不要把问题弄复杂了!~
3. 情况考虑要比题目设置更加周全一些:
题目好像没提到一点,其实在进行订票时,也应该进行一轮该航班的 booked 列表的遍历。
因为,考虑真实情况时,同一个顾客是可以多次订票的,所以,我们需要先知道顾客之前有没有订过票,订过和没订过的处理方式是不同的。
4. 语法点和知识不太熟练,导致的失误
4.1. 在进行字符串比较时,又忘了两个字符串之间是不能直接用 == 来判断相等的,而是应该用 equals 函数,又一次把 C++的语法规则套在Java上用了…说明我学的还是不到位啊!
4.2. 此外,用于读取 String对象的 next 和 nextLine,必须弄清楚两者的区别,正确选择用哪个,否则用了 equals 来比较以后,得到的结果仍然是不相等
4.3. 使用泛型前,要先对其进行初始化,否则会出现空指针错误
-------------------------------其他相关文章------------------------------
[ Java学习 ] 类的其他文章汇总(都是超链接,可直接点击):
java关于泛型的实验代码_[ Java学习 ] 泛型类的应用实验相关推荐
- java关于泛型的实验代码_[改善Java代码]强制声明泛型的实际类型
Arrays工具类有一个方法asList可以把一个变长参数或数组变成列表,但是它有一个缺点:它所生成的List长度是不可改变的,而这在我们的项目开发中很不方便. importjava.util.Arr ...
- java记事本实验总结_第十四周课程总结实验报告(简单记事本的实现)
课程总结: JDBC: Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新 ...
- Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)
Java框架JSON-RPC项目demo代码实战 备注 JAVA WEB配置虚拟目录(转自21天java web开发) https://blog.csdn.net/wjxbj/article/det ...
- java静态变量需要初始化吗_» Java静态变量初始化顺序浅谈
Java 类初始化顺序在网上已经有很多文章了,这里不再谈那么多,仅仅谈下Java静态变量的初始化顺序,如果你是Java高手,并且自认为对这个顺序已经掌握到了炉火纯青的境界,请忽视这篇文章. 前天看了Y ...
- arm嵌入式led灯闪烁实验报告_嵌入式led灯亮灭实验报告
实验名称 Led 灯的亮灭 姓名 XXX 学号 XXX 一. 实验目的 通过在 ARM7TDI 实验机上,使 D7~D8 两个灯如下进行亮灭:开始时 D7 灯亮, D8 灯灭:而后 D7 灯灭, D8 ...
- 科大奥锐密立根油滴实验数据_请问科大奥锐的实验满分都是100吗?
单摆法测量重力加速度 100 钢丝杨氏模量的测定 60 光电效应和普朗克常量的测定 60 迈克耳孙干涉仪 180 密立根油滴实验 100 偏振光的观察与研究 100 声速的测量 100 示波器实验 1 ...
- 大学物理实验电学基本参数的测量实验报告_基本电学参数测量物理实验,天津科技大学...
基本电学参数测量实验报告 班级 ***** 组 A 姓 名 *** 学号 ******** 实验成绩 [实验目的] 了解电学实验的要求.操作流程和安全知识: 学习电学实验中常用仪器的使用方法: 学会测 ...
- 部署Linux服务器实验报告,Linux服务器学习----tomcat 服务配置实验报告(一)
一.实验目的 1. 掌握 tomcat 服务的搭建 二.实验内容 1. 搭建一台缓存 tomcat 服务器 三.实验环境 1. tomcat 服务器 centos7 对应主机 ip 为 10.10.6 ...
- java程序设计及实践实践代码_杭+新闻:姚争为老师把程序设计讲“活”了,满是代码的枯燥课程被学生“秒杀”...
通讯员 陈鑫 杨鹏飞 记者 方秀芬 作为专业选修课,Java程序设计和Web程序设计,这两门满是代码的课程,看似很枯燥,但在杭师大信息科学与工程学院却爆红,每学期都遭"秒杀",以前 ...
最新文章
- linux 测试内存性能,Linux性能测试指标评估
- 机器学习导论(张志华):渐近性质
- C++ #include <.h>和“.h“的区别
- C4.5决策树算法概念学习
- java ee junit_JavaEE——Junit
- 两道挺有意思的思考题
- 95-136-041-源码-Operator-TwoInputStreamOperator
- qt 运动控制软件 界面_开源库分享----一款跨平台图形界面的百度网盘不限速客户端...
- Python机器学习:Grid SearchCV(网格搜索)
- 【网络流量识别】【聚类】【一】模糊聚类FCS和GA—网络安全网络流量功能的模糊聚类
- dell服务器硬件参数提升速度,DELL R620服务器配置
- 世界上云平台有很多,但叫机智云的只有一个。
- 「建议观看」史上超长,前端css晦涩难懂的点都在这啦
- LDIFDE试验全记录
- 数据处理的基本方法--简要介绍
- Java之三目运算符
- 第k短路----A*算法
- Python中找出dataframe中的重复的行 DataFrame.duplicated()方法
- matlab之ARMA(p,q)模型
- 评委打分表模板_系高中英语作文模板——邀请信
热门文章
- 今日代码(200727)--全局空间自相关性
- 第三次学JAVA再学不好就吃翔(part90)--TreeSet
- R语言观察日志(part9)--RMarkdown之输出格式
- GIT项目管理工具(part5)--查看commit 日志记录
- [转载]sql(hive)中变量的使用
- 如何自动化识别异常数据?达到智能预警?
- 利用等积变换巧解三角形面积问题
- 浅谈 Orbeon form builder 的权限控制
- 如何找到在SAP社区上经过SAP官方认可比较有影响力的SAP从业者
- Hybris commerce里用web service为什么查询不到产品的描述信息