JAVA季度编程考试试题
公司招聘录取问题
某集团公司业务发展迅速,各事业部普遍面临开发人员不足的情况。因此,公司决定在下个月面向社会公开招聘开发人员。
本次共有多个事业部参加本次社会招聘,每个事业部计划招聘的人数固定但并不一定相同。每位应聘者只能申请两个事业部的开发岗位(申请数量不能多也不能少,否则视为主动放弃录取),并参加公司组织的笔试与面试,两成绩相加是最终成绩。有专人对成绩进行汇总整理。
为了使录取工作公平透明,录取工作过程中的应聘人员不使用姓名,而使用参加考试时分配的唯一编号(为整数)来表示,编号按报名的先后逐一分配。
公司按应聘者的最终成绩进行择优录取,录取原则是:从高分到低分依次对每位应聘者先按其第一志愿录取;当不能按其第一志愿录取时,便将他的成绩扣去5分后,重新排队,并按其第二志愿考虑录取。为了严格控制录取人数,公司规定,如果出现分数相同的情况,优先录取编号靠前的人员。
各事业部录取不设最低分数线,招聘至额满为止,或已对全部应聘者都作了录取处理。
程序需要输出各事业部实际招聘的应聘人员,每个事业部的被录取者需要是有序队列(按被录取者成绩从高到低)。
为降低复杂度,减化输入输出操作,所有输入、输出采用文本文件的形式,并都放在 c:\test 目录下。并且,文件记录从第一行开始,即没有表头行。
输入文件信息
1)计划招聘人数的信息,包含了所有参加本次招聘的事业部名称,及各自计划招聘的人数。文件名称:plan.txt,每行记录为一个事业部的录取计划人数信息,内容为:
事业部名称,计划招聘人数
2)应聘者成绩及所申请的事业部开发岗位信息。文件名称:source.txt,每行为一个应聘者的信息,内容为:
人员编号,成绩,事业部名称1,事业部名称2
由于数据由专人手工准备,因此可能存在错误。对于非法输入信息:
1)非法数据分为两大类:
一类是“数据错误”,如字段的缺失、类型不正确等等。
一类是“数据重复”,是指①plan.txt中的两行或多行有相同的部门名称;②source.txt中的两行或多行具有相同的编号。
要求对于一条数据,优先检查“数据错误”的问题,即:如果某记录存在“数据错误”问题,不再进行“数据重复”的检查。
2)处理时,直接跳过非法数据,继续进行下面数据的处理。同时,要求在日志文件 result.log 中记录信息:
文件名:被视为非法的那行数据内容:错误类型
其中“错误类型”可以是“数据错误”或“数据重复”。
举例:假设 “网络”在plan.txt中出现第二次;10号人员只申请了“培训中心”的开发岗位。在result.log文件中日志信息记录为:
plan.txt:网络,5:数据重复
source.txt:10,98,培训中心:数据错误
注:如果采用log4j进行日志记录,由于参数配置会影响每行记录的信息。我们在考试中"不做严格要求","只要"所在日志记录行中出现上述要求的信息即可满足要求。
输出文件要求:
1)输入格式为事业部名称与录用人员编号列表。文件名称:result.txt,每行为一个事业部的录取情况,内容为:
事业部名称:人员编号1,人员编号2,人员编号3
2)为了方便结果的校验,结果请按事业部名称升序输出。排序时使用开发语言提供的基本的字符串比较方法,不需要考虑如拼音、笔划、大小写等因素。
提示与要求:
编程过程中,可以使用apache commons包中的api (这个建议与考查的内容无关,至少便于对处理文件关闭进行处理,评分是不会有任何影响)
除以上包以外,请使用j2se5.0或6.0的标准内容。引入其他第3方库并不符合考试要求。
文件列表
1:plan.txt
政府,3 软开,6 网络,3 网络,5
2:source.txt
1,86,网络,软开 2,20,软开,网络 3,43,网络,政府 4,92,政府,网络 5,54,软开,政府 6,29,政府,软开 7,9,网络,软开 8,57,软开,网络 9,50,网络,政府 10,46,政府,网络 11,51,软开,政府 12,33,政府,软开 13,70,网络,软开 14,98,软开,网络 15,29,网络,政府 16,4,政府,网络 17,26,软开,政府 18,52,政府,软开 19,95,网络,软开 20,41,软开,网络 21,68,网络,政府 22,88,政府,网络 23,77,软开,政府 24,42,网络,软开 25,84,软开,网络 26,98,交通
3:result.txt
政府,4,22,63 网络,19,1,13 软开,14,25,23,8,5,11
4:result.log
plan.txt:网络,5:数据重复 source.txt:26,98,交通:数据错误
解题如下
1:User.java
package com.test; /** * 应聘者类 */ public class User { private int bh; private int cj; private String dyzy; private String dezy; public User(int bh, int cj, String dyzy, String dezy) { this.bh = bh; this.cj = cj; this.dyzy = dyzy; this.dezy = dezy; } public int getBh() { return bh; } public int getCj() { return cj; } public String getDyzy() { return dyzy; } public String getDezy() { return dezy; } @Override public String toString() { return this.bh+","+this.cj+","+this.dyzy+","+this.dezy+"\r\n"; } }
2:Dept.java
package com.test; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; /** * 部门招聘计划类。 */ public class Dept { private static Logger logger = Logger.getLogger(DataLoader.class); private String name ; private int number; private List<User> list = new ArrayList<User>(); public List<User> getList() { return list; } public void setList(List<User> list) { this.list = list; } public Dept(String name, int number) { this.name = name; this.number = number; } public String add(User u){ if(list.size()<number){ list.add(u); logger.info(name+"录取"+u+"还需"+(number-list.size())); return "success"; }else{ logger.info(name+"已录取满"); return "failure"; } } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } @Override public String toString() { return this.name+"计划招聘"+this.number+"人"; } }
3:DataLoader.java
package com.test; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; /** * 加载数据文件 */ public class DataLoader { public static String PLAN_PATH = "C:\\test\\plan.txt"; public static String SOURCE_PATH = "C:\\test\\source.txt"; private static Logger logger = Logger.getLogger(DataLoader.class); public static Map<String, String> smap = new HashMap<String, String>(); /** * 加载部门招聘计划 * @return */ public static Map<String,Dept> loadDept(){ Map<String,Dept> map = new HashMap<String,Dept>(); File file = new File(PLAN_PATH); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String tempString = null; while ((tempString = reader.readLine()) != null) { String[]arr = tempString.split(","); if(!map.containsKey(arr[0])){ smap.put(arr[0],arr[0]); map.put(arr[0], new Dept(arr[0],Integer.valueOf(arr[1]))); }else{ logger.error(PLAN_PATH+" "+tempString+" 数据重复!"); } } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } return map; } /** * 加载应聘人员信息 * @return */ public static List<User> loadUser(){ List<User> list = new ArrayList<User>(); File file = new File(SOURCE_PATH); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String tempString = null; while ((tempString = reader.readLine()) != null) { String[]arr = tempString.split(","); if(arr.length<=4){ if(smap.containsKey(arr[2])&&smap.containsKey(arr[3])){ list.add(new User(Integer.valueOf(arr[0]),Integer.valueOf(arr[1]),arr[2],arr[3])); }else{ logger.error(SOURCE_PATH+" 数据错误"+tempString); } }else{ logger.error(SOURCE_PATH+" 数据错误"+tempString); } } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } return list; } /** * 写文件 * @param content */ public static void writeFile(String content){ File f = new File("C:\\test\\result.txt"); FileWriter writer; try { f.createNewFile(); writer = new FileWriter("C:\\test\\result.txt", true); writer.write(content); writer.close(); } catch (IOException e1) { e1.printStackTrace(); } } }
4:UserComparator.java
package com.test; import java.util.Comparator; /** * 排序类 */ public class UserComparator implements Comparator<User> { @Override public int compare(User u1, User u2) { if (u1.getCj() > u2.getCj()) { return -1; } else if (u1.getCj() < u2.getCj()) { return 1; } else { if (u1.getBh() < u2.getBh()) { return -1; } else if (u1.getBh() < u2.getBh()) { return 1; } else { return 0; } } } }
5:Main.java
package com.test; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.log4j.Logger; /** * 主方法入口 */ public class Main { private static Logger logger = Logger.getLogger(DataLoader.class); public static void main(String[] args) { //加载部门招聘计划和应聘者信息 Map<String,Dept> map = DataLoader.loadDept(); logger.info("招聘计划:"+map); List<User> ul = DataLoader.loadUser(); //按成绩和编号对应聘者排序 UserComparator uc = new UserComparator(); Collections.sort(ul, uc); logger.info("应聘人员信息:"+ul); //按照筛选规则进行筛选 while(ul.size()>0){ User u = ul.get(0); String dyzy = u.getDyzy(); //如果第一专业为空,说明是第一专业没录取,则录取第二专业。 if(!dyzy.equals("")){ Dept dy = map.get(dyzy); //如果没有录取成功成绩减5分按第二计划录取 if(!dy.add(u).equals("success")){ ul.add(new User(u.getBh(),u.getCj()-5,"",u.getDezy())); }; }else{ String dezy = u.getDezy(); Dept de = map.get(dezy); if(!de.add(u).equals("success")){ logger.info(u.getBh()+"两个专业都没录取。"); }; } ul.remove(u); Collections.sort(ul, uc); logger.info("还有"+ul.size()+"人等待录取"); for(User us:ul){ logger.info(us); } logger.info("-------------------------------"); } //输出筛选结果 Set<Entry<String, Dept>> set = map.entrySet(); Iterator<Entry<String, Dept>> it = set.iterator(); StringBuilder sb = new StringBuilder(); while(it.hasNext()){ Entry<String, Dept> entry = it.next(); sb.append(entry.getKey()).append(","); List<User> list = ((Dept)entry.getValue()).getList(); for(int i=0;i<list.size();i++){ sb.append(list.get(i).getBh()); if(i!=list.size()-1){ sb.append(","); } } sb.append("\r\n"); } DataLoader.writeFile(sb.toString()); } }