打乱Map key - value的对应顺序
应用场景:对于考试试卷选择题选项的乱序对应问题,防止考生作弊,每个人的题目都是不一样的选项顺序。
package com.muyuan.platform.elearning.util;
import com.alibaba.fastjson.JSONObject;
import com.muyuan.platform.elearning.vo.exam.QuestionVo;
import java.util.*;
/**
* 乱序工具类
*/
public class QuestionSelectRevertUtils {
/**
* 打乱Map key-value顺序,重新组合key-value
*
* @param questionJson
* @return
*/
public static Map<String, String> toDisOrder(String questionJson) {
QuestionVo questionVo = JSONObject.parseObject(questionJson, QuestionVo.class);
Map<String, String> map = questionVo.getOptionsMap();
String correctValue = map.get(questionVo.getCorrectOptions());
List<String> valueList = new ArrayList<>();
List<String> keyList = new ArrayList<>();
for (Map.Entry<String, String> entry : map.entrySet()) {
keyList.add(entry.getKey());
valueList.add(entry.getValue());
}
Collections.shuffle(valueList);
HashMap<String, String> revertMap = new HashMap<>();
for (int i = 0; i < keyList.size(); i++) {
revertMap.put(keyList.get(i), valueList.get(i));
}
QuestionVo vo = new QuestionVo();
for (Map.Entry<String, String> entry : revertMap.entrySet()) {
if (entry.getValue().equals(correctValue)) {
vo.setCorrectOptions(entry.getKey());
vo.setCorrectValue(correctValue);
}
}
vo.setOptionsMap(revertMap);
vo.setQuestionContent(questionVo.getQuestionContent());
System.out.println("revertMap: " + JSONObject.toJSON(vo));
return revertMap;
}
public static String setOptions() {
QuestionVo questionVo = new QuestionVo();
questionVo.setQuestionContent("中华人民共和国的首都是哪里?");
Map<String, String> map = new HashMap<>();
map.put("A", "北京");
map.put("B", "天津");
map.put("C", "上海");
map.put("D", "重庆");
questionVo.setOptionsMap(map);
questionVo.setCorrectOptions("A");
questionVo.setCorrectValue("北京");
System.out.println("originMap: " + JSONObject.toJSON(questionVo));
return JSONObject.toJSONString(questionVo);
}
public static void main(String[] args) {
String s = setOptions();
System.out.println("\r\n");
int i = 0;
while (i < 10) {
toDisOrder(s);
i++;
}
}
}
输出结果:
originMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"北京","B":"天津","C":"上海","D":"重庆"},"correctOptions":"A"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"重庆","B":"上海","C":"天津","D":"北京"},"correctOptions":"D"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"北京","B":"上海","C":"重庆","D":"天津"},"correctOptions":"A"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"上海","B":"重庆","C":"天津","D":"北京"},"correctOptions":"D"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"重庆","B":"北京","C":"天津","D":"上海"},"correctOptions":"B"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"北京","B":"天津","C":"上海","D":"重庆"},"correctOptions":"A"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"天津","B":"北京","C":"上海","D":"重庆"},"correctOptions":"B"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"上海","B":"重庆","C":"天津","D":"北京"},"correctOptions":"D"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"北京","B":"重庆","C":"天津","D":"上海"},"correctOptions":"A"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"上海","B":"重庆","C":"北京","D":"天津"},"correctOptions":"C"}
revertMap: {"questionContent":"中华人民共和国的首都是哪里?","correctValue":"北京","optionsMap":{"A":"上海","B":"重庆","C":"北京","D":"天津"},"correctOptions":"C"}
打乱Map key - value的对应顺序的更多相关文章
- Java中Map<Key, Value>存储结构根据值排序(sort by values)
需求:Map<key, value>中可以根据key, value 进行排序,由于 key 都是唯一的,可以很方便的进行比较操作,但是每个key 对应的value不是唯一的,有可能出现多个 ...
- Map<Key,Value>基于Value值排序
Map<Key,Value> 排序默认是按照KEY值的升序来进行. 针对按照Value来进行排序有两种方法: 第一种 使用TreeMap 代码如下 public class test{ ...
- map访问key不存在的情况下,用find。比[]直接访问的意思不一样,map[key]不返null
key不存在的话则创建一个pair并调用默认构造函数 map<CGuid, CLibItem>::iterator iterItem = m_world->m_library_sce ...
- Sass Maps的函数-map-remove($map,$key)、keywords($args)
map-remove($map,$key) map-remove($map,$key) 函数是用来删除当前 $map 中的某一个 $key,从而得到一个新的 map.其返回的值还是一个 map.他并不 ...
- Sass函数:Sass Maps的函数-map-has-key($map,$key)
map-has-key($map,$key) 函数将返回一个布尔值.当 $map 中有这个 $key,则函数返回 true,否则返回 false. 前面的示例,当 $key 不在 $map 中时,使用 ...
- Sass函数:Sass Maps的函数-map-get($map,$key)
map-get($map,$key) 函数的作用是根据 $key 参数,返回 $key 在 $map 中对应的 value 值.如果 $key 不存在 $map中,将返回 null 值.此函数包括两个 ...
- Go语言 判断key是否在map里 if _, ok := map[key]; ok
if val, ok := map[key]; ok { //do something here } 如果key在map里 val 被赋值map[key] ok 是true 否则val得到相应类型的零 ...
- 关于Map迭代循环,key和value的顺序问题
使用Hashtable,keySet()返回的顺序为降序(key降顺序) ---->6, 5, 4, 3, 2, 1使用TreeMap,keySet()返回的顺序为升序(key升顺序) ---- ...
- 对map创建出来的值顺序排序问题
TreeMap 在用Ajax动态创建checkBox时,而把值放在了HashMap中,hashMap是无序的,因此你动态创建出来的顺序是乱的,比如你想要的顺序是1.2.3.4但出来的结果可能是 3.2 ...
随机推荐
- spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)
一,为什么要使用async异步线程池? 1,在生产环境中,有一些需要延时处理的业务场景: 例如:发送电子邮件, 给手机发短信验证码 大数据量的查询统计 远程抓取数据等 这些场景占用时间较长,而用户又没 ...
- IDEA 半天卡住buid(编译)不动
[号外号外!] 最终解决办法并不复杂,关键在于"遇见问题,怎么样层层分析,多条路径试错,最终解决问题的思路或者能力"--资深码农的核心竞争力之一 背景 今天结束完最近2个月的一个项 ...
- 字节跳动2020Java面经,你离高薪就只差一片面试题了
前言 经历了惨痛的春招与秋招之后,也积攒了一些面经,希望能对大家有所帮助.由于字数限制需要答案的可以关注GZH[程序员空间] 免费领取完整版PDF 其他 什什么是幂等?什什么情况下需要考虑幂等?你怎么 ...
- int是java.lang包中可用的类的名称
int是java.lang包中可用的类的名称(x) int为基本数据类型,不是类
- count=count++
count=count++ 的最终值是count =count,没加上1,该是啥是啥 count++ 的最终值是加一的值 注意: count = count ++ + 1 最终还是1
- 1024|推荐一个开源免费的Spring Boot教程
2020-1024=996! 今天,星期六,你们是否加班了?我反正加了!早上去公司开了一早上会,中午回家写下了这篇文章. 今天,我要推荐一个开源免费的Spring Boot项目,就是我最近日更的Spr ...
- Java线程池的四种创建方式
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFix ...
- WIN32之消息队列
0x01. 什么是消息? 当我们点击鼠标的时候,或者当我们按下键盘的时候,操作系统都要把这些动作记录下来,存储到结构体中,这个结构体就是 消息 比如我们点击运行程序,是通过消息队列获取,通过explo ...
- Python使用协程进行爬虫
详情点我跳转 关注公众号"轻松学编程"了解更多. 1.协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 ?? 首先我们得知道协程是啥?协程其实可以认为是比线程更小 ...
- NOI2020D1T1美食家
传送门:QAQQAQ 完了完了NOI签到题全班打不出来,真就全部成为时代的眼泪了... 首先$O(mT)$的$dp$显然,然后因为$T$很大$w$很小矩阵快速幂显然,但是有$k=200$卡不过去. 然 ...