您的位置:首页 > 编程语言

软工实践结对编程第二次作业

2017-10-09 18:37 239 查看

结对项目--第二次作业

姓名学号班级
晓晖235k
钦泽232z

链接:

队友博客链接

github地址

设计api接口:

public interface allocate {
public  void Input$Parse(int depnums,int stunums);//读入与处理json数据
public  List<String>[] allocateStu(int depnums , int stunums,readJson r)//实现分配
public void outtotxt(List<String>[] dep , Map<Integer,Map<String,String>> departments)//输出
}

内部实现设计(类图):



匹配算法设计:

部门活动时间申请者不可请假超过2次;

按志愿分配,志愿有五个,可不填,优先分配第一志愿、第二志愿以此类推;若第一志愿部门被分配人数已达到或超过可接收人数上限,则不进行第二轮分配,以此类推;

若在某轮次超过部门可接收人数上线,则按权值淘汰,如兴趣和部门匹配一个权值+1,请假一次权值-1;若出现权值为4应被淘汰,淘汰人数有一人,但权值为4的人有2人类似的情况,采用随机淘汰。







测试数据生成:

两个json数组,students和departments,students中含有学号,志愿,某志愿部门活动时间请假次数(这个想法是部门提前确定活动时间,然后学生填申请表的时候以按钮的形式选择是否要请假)

departments中含有部门号,部门可接收人数上线,部门的特点(和学生兴趣匹配)。

参考数据如下:

{
"students": [
{
"number_of_leave": "[2]",
"student_no": "021804021",
"applications_department": "[D001]",
"tags": "[study, music]"
}
],
"departments": [
{
"department_no": "D001",
"member_limit": 13,
"tags": "[basketball, study, film]"
}
]
}

评价自己的算法:

评价算法的时候先吐槽下自己的编程风格,别拿着题就做好不好,又不是刷leetcode,下次拿到这种要整合进项目的功能的实现的时候,先画uml图好不好,这模块化思想严重的编程风格。。。看着自己都难受,当然这次把map,set,list等容器都用得手顺了,也不错。。。

基本还勉强做了到公平和合理吧,部门的事我不太懂,至于志愿为主的分配方式参考的是福大的高考招生分配方式;大方向我认为没错,细节还可以再优化,实现起来非常简单是优点。但是有点死板了。在想会不会部门自己设置权值然后全不按照权值淘汰比较好。

关键代码解释:

存取json解析后的数据,json两层内用嵌套的hashmap,key用学号和部门号,某些需要三层的存在新的hashmap上。

private Map<String,Map<String,String>> students = new HashMap<String,Map<String,String>>() ;

最重要的分配是按志愿分配,基本上做的就是遍历map然后读取志愿(假设当前是第一轮),如果请假没有超过两次,则存入部门号对应的list。

for(Map.Entry<String, List<String>> entry : r.getStudentsApplications_department().entrySet())
{

if(entry.getValue()!=null&&entry.getValue().size()>i)
{
List<String> temp = entry.getValue();
int j=Integer.parseInt(temp.get(i).replaceAll("D", ""));
if(Integer.parseInt(r.getStudentsNumber_of_leave().get(entry.getKey()).get(i))<2)
{
if(flag[j]==false)
{
dep1[j].add(entry.getKey());
}
}

}
}

运行及测试结果展示

测试200位同学,20个部门的情况

{
"admitted": [
{
"member": "[281704887, 071801590, 051804297, 021701098, 081601088, 301702852, 191602318, 061602540, 071803492, 301503594, 231804432, 061804762, 101504058, 251804029]",
"department_no": "D001"
},
{
"member": "[151701348, 111604145]",
"department_no": "D002"
},

测试500位同学,30个部门的情况

{
"admitted": [
{
"member": "[261804155, 191702610, 231503195, 231703323]",
"department_no": "D001"
},
{
"member": "[131501362, 121801993, 261601930, 101504851, 111804998, 091702420, 211803469, 241602552, 011501572, 051701493, 101601775]",
"department_no": "D002"
},

测试1000位同学,50个部门的情况

{
"admitted": [
{
"member": "[261802571, 081702481, 221803611, 101502116, 161601728, 091503497, 291802997, 171604700, 161501780, 171804673, 151603587, 061503789]",
"department_no": "D001"
},
{
"member": "[261504938, 051602615, 201604139, 021802744, 061601211, 171604742, 241703750, 261803870, 101804707]",
"department_no": "D002"
},

测试5000位同学,100个部门的情况

{
"admitted": [
{
"member": "[181701035, 101503560, 061602490, 191701170, 131702320, 011802041, 101604515, 031703677, 291601353, 061602760]",
"department_no": "D001"
},
{
"member": "[181802659, 211701954, 161602285, 071701555, 021502729, 181504020]",
"department_no": "D002"
},

效能分析:

好险我写的代码耦合度及其的低,调用只有get一点readjson里的属性,这样没有枪没有炮我能自己造呀。哈哈哈哈.jpg

以s5000,d100为例子

各方法运行时间,单位纳秒:



这是存下来的调用关系。。再写个方法分析一下。。



左边是caller,callee是readjson中的get方法。



遇到的困难及解决方法:

1、修改的时候被自己原始代码恶心到了,解决就是人肉跑了一遍,收获就是下次编码一定一定要先好好设计。

2、这个出于好奇,想给json的输出排序。解决方法就是在群里问,然后助教和范飞龙老师给出了实现方案,尤其范飞龙老师还讲了具体的操作,不要太开心(:。收获嘛,好奇宝宝加皮实加脸皮厚真是个好品格。

对队友的评价:

优点:我在看算法课呢,明年就秋招了,菜鸡也得挣扎几下了。哈?你已经做完结对编程的作业了?6666。。。给大佬递茶.jpg

缺点 : 卧槽,什么鬼,全程用String操作,异教徒啊你,请自行反编译String操作好不好,请大声跟我念StirngBuilder、StringBuffer,StringBuilder、StringBuffer...;卧槽,什么鬼,谁告诉你学号是顺序的,请大声更我念Random,Random,Random...;卧槽,什么鬼,你学生兴趣重复了,请大声跟我念Set,Set,Set...;卧槽,算了我自己写过吧。。。。

PSP:

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1010
· Estimate· 估计这个任务需要多少时间1010
Development开发
· Analysis· 需求分析 (包括学习新技术)80140
· Design Spec· 生成设计文档
· Design Review· 设计复审 (和同事审核设计文档)
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)
· Design· 具体设计00
· Coding· 具体编码60120
· Code Review· 代码复审2020
· Test· 测试(自我测试,修改代码,提交修改)60120
Reporting报告3060
· Test Report· 测试报告
· Size Measurement· 计算工作量
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3060
合计150270

学习进度条:

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
16006002222和javaio死磕了一边
2100016002648xml解析与nabcd
3\443225932100148国庆没了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: