Java考试系统题目和选项乱序实现
学习笔记——日常实现思路
要求:实现每个考生对于一套试卷进行乱序显示。
前提:由于所有考生的试卷是一套,且只有一份数据,并不是每个考生都生成了一份试卷。要想保证每个考生进入考试都看到不一样的顺序,以及要保留考生每次进去之后要与初次进入的乱序结果要一致。
思路:要乱序还要保留原始数据,则需缓存数据,缓存有两个方案: 1、考虑Redis进行缓存每个考生考试的试题和选项乱序顺序数据。 2、在考生开始考试后存储当前考生所有提交的试题答案数据,一道题一条数据(带有默认空答案)。此时存储当前试题的顺序,和选项顺序Id排列。
步骤: 1、考试提交答案数据关联着试卷Id、试题Id,需增加试题当前的顺序,试题对应的选项Id集合。 2、每次考生点击开始考试后,存储乱序后的试题和选项。 3、获取试卷试题数据时,根据答案数据反向去获取试题和选项数据进行组装。
考生进入后乱序试题生成实现代码块:
//原始数据试题Id集合 List<Integer> questionIdList = new ArrayList<Integer>(); //将试题Id乱序 Collections.shuffle(questionIdList); //存放乱序后试题排序,key:试题Id,value:试题排序 Map<Integer,Integer> questionSortMap = new HashMap<Integer, Integer>(); int sort = 1; for(Integer qId:questionIdList) { questionSortMap.put(qId, sort); sort++; } //此时questionSortMap为最新试题乱序数据,可缓存。 //原始选项Id集合 List<Integer> questionItemIdList= new ArrayList<Integer>(); //将选项Id乱序 Collections.shuffle(questionItemIdList); //此时questionItemIdList为最新选项乱序数据,可缓存。
考生进入时获取初次乱序缓存的数据进行渲染:
//获取缓存的试题顺序进行排序渲染 userAnswerList.sort(Comparator.comparing(exam_examinee_answer::getQuestionSort)); //获取试题绑定的乱序选项Id //mysql使用 order by field(id,?)关键字进行固定顺序查询。 select * from tableName where id in (4,3,1,2) order by field(id,4,3,1,2); //由于乱序选项之后的A、B、C、D顺序也乱了,则需要对乱序后的选项数据重新赋字母。 for (int i = 0; i < itemList.size(); i++) { item = itemList.get(i); item.setSort((char) (65 + i)); } //其中可使用ASCII码获取大写字母,进行char类型强转会根据ASCII码转成对应字母的字符。
以上就完成的乱序试题和选项啦个人业务实现提取的思路哈~
Tips: 1、ASCII码65~90为26个大写英文字母 2、ASCII码97~122为26个小写英文字母
上一篇:
IDEA上Java项目控制台中文乱码