这次实验主要是基于时间段类及其变种实现排班,进程管理和课表管理系统
DutyRoster:这是一个值班应用,可以手动或自动为员工排班
ProcessSchedule:操作系统进程调度管理应用,可随机执行进程,也可采用最优执行.
CourseSchedule;课表管理系统,先储存学期要上课程,然后提供选课操作,同时还能查看未排完课程以及空闲重复时间占比
应用 |
差异 |
共性 |
DutyRoster |
时间段不可重叠,一个标签只能对应一个时间段 |
都是时间段有关程序 |
ProcessSchedule |
时间段不可重叠,一个标签能对应多个时间段 |
|
CourseSchedule |
时间段可重叠,一个标签能对应多个时间段 |
-
-
- IntervalSet<L>的共性操作
-
方法 |
作用 |
getPeriods() |
返回时间段集合 |
Insert(start.,end,label) |
插入时间段 |
Labels() |
返回类中的标签集合 |
Remove(label) |
将时间段集合中所有与label时间段删除 |
Sort() |
将时间段按起始时间按从小到大排序 |
面向各应用的IntervalSet子类型设计(个性化特征的设计方案)
CommonIntervalSet是对接口IntervalSet的实现
实例域
private List<Period<L>> periods = new ArrayList<>();
实例方法集合
方法 |
作用 |
getPeriods() |
返回时间段集合 |
Insert(start.,end,label) |
插入时间段,插入是若同一标签对应多个时间段,则输出提示信息并返回 |
Labels() |
返回类中的标签集合 |
Remove(label) |
将时间段集合中与label时间段删除 |
Sort() |
将时间段按起始时间按从小到大排序 |
toString() |
将内荣以字符串的形式输出 |
Start(L label) |
返回label对应时间段的起始时间 ,若没有该时间段返回-1 |
End(L label) |
返回label对应时间段的结束时间 ,若没有该时间段返回-1 |
-
- 面向可复用性和可维护性的设计:MultiIntervalSet<L>
MultiIntervalSet是对接口IntervalSet的实现
实例域
private List<Period<L>> periods = new ArrayList<>();
实例方法集合
方法 |
作用 |
getPeriods() |
返回时间段集合 |
Insert(start.,end,label) |
插入时间段 |
Labels() |
返回类中的标签集合 |
Remove(label) |
将时间段集合中与label时间段删除 |
Sort() |
将时间段按起始时间按从小到大排序 |
toString() |
将内荣以字符串的形式输出 |
MultiIntervalSet(IntervalSet<L> initial) |
构造方法将initial中的时间段加入到集合中 |
intervals(L label) |
返回以开始时间从小到大排序后所有和label相关的时间段 |
对于三个问题的类分别为Employee,Process,Course;三个类都是immutable
Employee
实例域 用final修饰保证immutability
final public String name;
final public String jobTitle;
final public String phoneNumber;
实例方法
Employee |
构造方法 |
hashCode |
根据三个实例变量计算hash值 |
equals |
判断两个Emloyee是否相等 |
toString |
将变量转换为String输出 |
Process
实例域 用final修饰保证immutability
final public int id;
final public String name;
final public long shortestTime;
final public long longestTime;
final public long time;
实例方法
Process |
构造方法 |
hashCode |
根据三个实例变量计算hash值 |
equals |
判断两个Emloyee是否相等 |
toString |
将变量转换为String输出 |
complete |
判读进程是否已经运行完若运行完返回true |
compareTo |
根据longestTime-time的大小得出排序优先级差值小的排在前 |
Course
实例域 用final修饰保证immutability
final public int id;
final public String cName;
final public String teacher;
final public String location;
final public int times;//剩余排课次数
实例方法
Course |
构造方法 |
hashCode |
根据三个实例变量计算hash值 |
equals |
判断两个Course是否相等 |
toString |
将变量转换为String输出 |
DutyRosterApp中的每个员工只能对应一个时间段所以委托CommonIntervalSet
实例域
private long start,end;//起止时间
private List<Employee> Employees = new ArrayList<>();
private CommonIntervalSet<Employee> Intervals = new CommonIntervalSet<>();
static SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");//日期转换格式
实例方法
SetDate |
设置排班起止日期 |
FindEmployee |
根据姓名查找员工 |
AddEmployee |
添加员工 |
DelEmployee |
将员工的排班删除同时在员工集中将他删掉 |
AutoSetTime |
自动排班 |
SetTime |
将某个员工排班起止日期为start,end |
showDutyRoster |
展示排班表 |
ShowRestTime |
展示未排班时间段以及为安排时间占比 |
ProcessScheduleAPP中一个进程可以对应多个时间段所以委托multiIntervalSet实现
实例域
private List<Process> process = new ArrayList<>();
private long timeLine = 0;
private IntervalSet<Process> Intervals = new MultiIntervalSet<>();
实例方法
AddProcess |
添加一个进程 |
RandomSelecct |
随机选择一个进程执行也可以不选择进程 |
priorSelect |
优先选择最优进程执行 |
ShowProcess |
展示之前运行过的进程 |
ShowLastProcess |
展示最近运行的进程 |
CourseScheduleApp每个课程可以对应多个时间段所以委托multiIntervalSet实现
实例域
private Date start;
private int week;
private MultiIntervalSet<Course>[] Days = new MultiIntervalSet[8];
private List<Course>courses = new ArrayList<>();
实例方法
CourseScheduleApp |
构造方法 |
addCourse |
添加课程 添加时学时数应为偶数 |
findCourse |
根据课程名寻找课程 |
selectCourse |
选课安排某个课到周几的某个时间段 |
showRest |
展示为排完的课 空闲时间比例和重复时间比例 |
showCourse |
展示一周内某天的课程 |