从数据库抽取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的使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,可以按照以下步骤实现: 1. 在后端编写一个API接口,接受来自安卓端的请求。 2. 在后端连接数据库,并编写一个查询语句,随机抽取10道题目。 3. 将查询结果返回给安卓端。 4. 安卓端接收到后端返回的题目数据后,进行解析并展示给用户。 下面是一个简单的代码示例(使用Java语言和MySQL数据库): 后端代码: ```java //导入相关包 @RestController @RequestMapping("/api") public class QuestionController { @Autowired private DataSource dataSource; @GetMapping("/questions") public List<Question> getQuestions() throws SQLException { Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM questions ORDER BY RAND() LIMIT 10"); List<Question> questions = new ArrayList<>(); while (rs.next()) { Question question = new Question(); question.setId(rs.getInt("id")); question.setTitle(rs.getString("title")); question.setContent(rs.getString("content")); // 将每个题目加入到题目列表中 questions.add(question); } rs.close(); stmt.close(); conn.close(); return questions; } } ``` 安卓代码: ```java // 导入相关包 public class MainActivity extends AppCompatActivity { private ListView questionListView; private List<Question> questionList = new ArrayList<>(); private QuestionAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); questionListView = findViewById(R.id.question_list_view); adapter = new QuestionAdapter(MainActivity.this, R.layout.question_item, questionList); questionListView.setAdapter(adapter); // 发送请求获取题目数据 sendRequest(); } private void sendRequest() { // 创建一个请求队列 RequestQueue queue = Volley.newRequestQueue(this); String url = "http://your.api.url/api/questions"; // 创建一个StringRequest对象 StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // 解析返回的数据 parseJSON(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, "请求失败!", Toast.LENGTH_SHORT).show(); } }); // 将请求添加到请求队列中 queue.add(stringRequest); } private void parseJSON(String jsonData) { Gson gson = new Gson(); List<Question> questions = gson.fromJson(jsonData, new TypeToken<List<Question>>() {}.getType()); questionList.clear(); questionList.addAll(questions); adapter.notifyDataSetChanged(); } } ``` 注意:以上代码仅为示例,具体实现方式可能因项目需求而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明天也是太阳花!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值