这次实验主要是基于时间段类及其变种实现排班,进程管理和课表管理系统
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 | 展示一周内某天的课程 |