从数据库抽取N道题,按题目权重分,抽取题目

背景
最近负责的一个考试系统,真是写不完的接口,天天都是带痛苦面具,话不多说,言归正传。

给我的是需求是这样的,如下:

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的使用

猜你喜欢

转载自blog.csdn.net/m0_61367109/article/details/121948814