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个小写英文字母

经验分享 程序员 微信小程序 职场和发展