一、结队伙伴
-
031502314柯豪燊
-
031502306陈晓凯
二、 githuba 链接
三、inupt_data.txt数据
###数据生成原理
-
在main函数里面输入学生人数和部门数量,例子里为150个学生,10个部门。
-
学号:顺序编号,直接采用“031502xxx”+编号,判断编号小于10,100,1000,来前置补0。
-
学生空闲时间:先随机产生空闲时间的个数,再从week数组(周一到周日)从随机抽取一天,从8-20随机出一个数值begintime。该算法有可能出现空闲时间相同的可能。
-
学生申请的部门:随机数产生
-
学生兴趣:从兴趣数组中非null的元素中随机产生,取出后该元素置为null。
-部门的编号、活动时间、兴趣与学生的相同。考虑的因素:
-
随机生成具有随机性,在学生基数大时,有一定的代表性。
-
学生空闲时间从平常大学生的日常出发,例如周六周日和工作日晚上大概率空闲,同时参照了作业博客里input_data里的数值,因此空闲时间数以13发散分布。
-
部门的活动时间则参考了作业博客里input_data里的数量,大概设置以3、4发散分布。
-
兴趣数量也是参考input,以5发散分布。
四、数据建模及匹配程序的思路及实现方式
-
数据建模:
-
beanStudent:
-
String student_no 学号
-
List free_time 空闲时间
-
List applications_department 申请的部门
-
List tags 个人兴趣
-
boolean Stu_admit 是否匹配到部门
-
-
beanDepartment:
-
String department_no; 部门编号
-
List event_schedules; 活动时间
-
int member_limit; 人数上限
-
List tags; 部门希望申请者拥有的兴趣
-
boolean Dep_admit 是否匹配到学生
-
List student_no=new ArrayList<>();已录取的学生的学号
-
-
匹配程序的思路及实现方式:
思路:
-
匹配思路很简单,从部门的角度出发从头到尾遍历学生,只要学生与所申请部门的活动时间和兴趣爱好都有一项匹配、部门人数未达上限即可进入该部门。
- 1、如果该学生有申请这个部门——进行下一步
- 2、如果该学生的空闲时间与部门的活动时间有一个匹配——进行下一步
- 3、如果该学生的兴趣爱好有一个和部门的一样——录取
-
实现方式:
List<beanStudent> stu= b.getStudents();
List<beanDepartment> dep = b.getDepartments();
for(int i=0;i<dep.size();i++)
{
beanDepartment bd=dep.get(i);//获得部门对象
for(int j=0;j<stu.size();j++)
{
beanStudent bs=stu.get(j);//获得学生对象
//System.out.println(bs.getApplications_department());
//System.out.println(bd.department_no);
if(bs.getApplications_department().contains(bd.department_no))
{
boolean Timematch=false;
List<String> es=bd.event_schedules;
List<String> ft=bs.free_time;
for(int k=0;k<es.size();k++)
{
String DepDay="";
String DepTime="";
for(int l=0;l<es.get(k).length();l++)
{
if(es.get(k).charAt(l)>=65&&es.get(k).charAt(l)<=122)
{
DepDay+=es.get(k).charAt(l);
}
else if(es.get(k).charAt(l)=='.')
{
continue;
}
else if(es.get(k).charAt(l)==':')
{
break;
}
else
{
DepTime+=es.get(k).charAt(l);
}
}
for(int n=0;n<bs.free_time.size();n++)
{
String StuDay="";
String StuTime="";
for(int m=0;m<ft.get(n).length();m++)
{
if(ft.get(n).charAt(m)>=65&&ft.get(n).charAt(m)<=122)
{
StuDay+=ft.get(n).charAt(m);
}
else if(ft.get(n).charAt(m)=='.')
{
continue;
}
else if(ft.get(n).charAt(m)==':')
{
break;
}
else
{
StuTime+=ft.get(n).charAt(m);
}
}
if(DepDay==StuTime&&(DepTime==StuTime)||(StuTime+1==DepTime))
{
Timematch=true;
break;
}
}
if(Timematch=true)
break;
}
List<String> tag=bd.tags;
for(int l=0;l<tag.size();l++)
if(Timematch=true&&bs.getTags().contains(tag.get(l)))
{
if(bd.member_limit-->0)
{
bs.Stu_admit=true;
bd.Dep_admit=true;
bd.student_no.add(bs.student_no);
break;
}
}
}
}
}
五、代码规范
-
初次接触java,很多规范都不懂,命名也很随意,在队友的帮助下认识到了命名的规范
-
类名首字母应该大写
-
方法名首字母应该小写
-
for、if等语句的{}在前面
-
六、结果评估
-
使用作业里面的input_data.txt的文件进行评测。
- 评测结果
- unlucky_student:156人
- unlucky_department:0
分析:根据input_data.txt文件里部门人数的上限,一定至少剩下63个学生匹配不到部门,156/300-63/300=31%,理论上有31%的未匹配率,再加上有志愿、空闲时间、兴趣等因素决定能否匹配,70%的匹配率还可以接受,大多部门都能录取10人以上,但该算法有 很大的缺点:
-
1、顺序遍历学生,对学号靠后的学生很不公平。
-
2、匹配思路太过简单。
-
改进:可设置绩点属性,对绩点、申请志愿、兴趣匹配度、空闲时间匹配度设置不同的得分权重,权重分布可详细讨论,对于每一个部门都会有一批申申请者,按分数高低进入部门,之后对unluck_student、department进行简单匹配;
七、心得体会
个人感受
-
这次作业让我的国庆假期不至于太过颓废,java之前有学过一点,写的都是一些很小的简单的程序,第一次用java写像这样的程序,在这次实践后,开始注重代码规范,一些原本没有意识到的知识的漏洞暴露了出来,同时也让我知道了之后前进的方向。并且学到了很多之前不会的技能
-
了解了jason格式,以及用工具包去解析jason取jason。
-
会用工具把java打包成.exe文件
结队体会‘
- 国庆中秋一起放,很开心地放假回家了,玩啊玩,早就把作业抛到脑后了,还好队友及时点醒了我,于是我们通过QQ在网上交流,队友解答了我关于题目的疑问,一起分享查找的资料,一开始对jason格式一脸茫然,后来知道用java解析比较简单,我们俩对java都不是很精通,最后敲定用简单的匹配思路。在这次的作业里,队友提供了很多思路和点子,我觉得他是一个很有想法、思维很活跃的好队友,这次结队非常愉快,让我们都学到了不少东西。