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


    结对项目--第二次作业

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

    链接:

    队友博客链接
    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.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 10 10
    · Estimate · 估计这个任务需要多少时间 10 10
    Development 开发
    · Analysis · 需求分析 (包括学习新技术) 80 140
    · Design Spec · 生成设计文档
    · Design Review · 设计复审 (和同事审核设计文档)
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范)
    · Design · 具体设计 0 0
    · Coding · 具体编码 60 120
    · Code Review · 代码复审 20 20
    · Test · 测试(自我测试,修改代码,提交修改) 60 120
    Reporting 报告 30 60
    · Test Report · 测试报告
    · Size Measurement · 计算工作量
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 60
    合计 150 270

    学习进度条:

    第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
    1 600 600 22 22 和javaio死磕了一边
    2 1000 1600 26 48 xml解析与nabcd
    34 4322 5932 100 148 国庆没了。。。
  • 相关阅读:
    JAVA代码覆盖率工具JaCoCo-原理篇
    (转载)比较web ui 框架
    sql拼接
    解决com.mysql.jdbc.PacketTooBigException: Packet for query is too large问题
    字符串中重复出现字符串个数
    Unable to load annotation processor factory
    三目运算符
    WSGI剖析
    深入剖析cpp对象模型
    Cpp下匿名对象探究
  • 原文地址:https://www.cnblogs.com/wkmocr/p/7642455.html
Copyright © 2020-2023  润新知