背景
最近负责的一个考试系统,真是写不完的接口,天天都是带痛苦面具,话不多说,言归正传。
给我的是需求是这样的,如下:
1.用户可以选择考试类型来考试,可以指定题目数来抽取考试题目,列如想考100道,
语文20题,数学30题,英语50题,并按照当前格式返回给前端
题目类型权重[{groupid,pert}], pert为占比总数100。
当我拿到这个需求的时候又带上了痛苦面具,我一看数据库有14种类型的题目,当时就头皮发麻,要是用户每个类型都想考一点,我直接裂开。然后就是到处百度,到处尝试。
代码如下:
/**
* 从数据库随机抽取N道题
*
* @param map count 题目总数量
* groupPert 题目类型权重[{groupid,pert}], pert为占比总数100
* @return
*/
@ResponseBody
@RequestMapping(value = "/queryByRandom", method = RequestMethod.POST)
public Result queryByRandom(@RequestBody Map<String, String> map) {
try {
int count = Integer.parseInt(map.getOrDefault("count", "0"));
String parmPert = map.get("groupId");
System.out.println(parmPert);
JSONArray array = JSONObject.parseArray(parmPert);
array = JSONObject.parseArray(parmPert); //[{"groupId":5,"groupPert":10},{"groupId":3,"groupPert":70},{"groupId":1,"groupPert":20}]
List<Map<String, Object>> lists = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
Map<String, Integer> param = new HashMap<>();
JSONObject object = array.getJSONObject(i);
int groupId = object.getInteger("groupId");
int groupPert = object.getInteger("groupPert");
int groupCount = (int) (count * (groupPert / 100d));
param.put("groupId", groupId);
param.put("groupCount", groupCount);
List<Map<String, Object>> res = iEfQuestionsDetailsService.queryByRandom(param);
lists.addAll(res);
System.out.println("参数权重,题目类型:" + groupId + ",占比" + groupPert + ",需要查询的题目数量为:" + groupCount);
}
if (lists.size() > 0) {
return ResultUtil.success(lists);
} else {
return ResultUtil.error("未查询到考试题目, 请联系管理员!");
}
} catch (Exception e) {
return ResultUtil.error("错误:" + e.getMessage());
}
}
在一番努力后写完了代码。用postman测试又出现了问题,我不管怎么写都是报错,来回折腾一个多小时,在网上找了很多资料,转json格式,有引号,中括号,斜杠\不知道怎么加
在尝试多遍后终于对了,就是这样:
大家以后用map一定要注意了,斜杠千万不要加错位置,不然一个头两个大。
好了,这样来就成功了。不管用户想考那个类型的题目,现在都可以解决了!
兄弟们一定要学好map呀,不然上班太难受了,希望能帮助到大家!
总结难点
1.在postman中map的转json格式
2.Jsonobject的使用