根据map的key唯一实现需求
最近在做一个以天为列的列表展示,但是通过接口拿过来的数据时间并不是连续规律的,而前端赋值是依据数组下标赋值,所以我后台根据map的key值重复覆盖的方式进行逻辑处理。
已知列为31天,将它(01,02,03....)作为key值,并存储对应的value值,在进行嵌套循环时已知key就31个,循环时进行判断如果这次循环的值没有则补充到map此次循环key对应value一个" - ",在循环有值时如果此key已经填充上" - "因为map中key的唯一性会进行覆盖,这样数据就完美的按照要求存储了,当然在判断没有值填充" - "时一定要判断此key是否存在了非" - "值,如果存在则跳过。
// 使用map的key相同会覆盖的特性处理没有值时按照序列填空
public List<Map<String, Object>> jsontolist(List<Map<String, Object>> jlist, int type) {
List<Map<String,Object>> mList = new ArrayList<Map<String,Object>>();// 定义list接受数据
Map<String,Object> map = new HashMap<String,Object>();// 定义map
for (Map<String,Object> jltm : jlist) {// 循环原始数据
for (int j = 1; j <= 31; j++) {// 列为31天
String tm = null;// 获取时间的天数为key
if(type==0) {// 为0时是用电量的时间取值 示例为tm=2019-11-23
tm = String.valueOf(jltm.get("tm")).split("-")[2].substring(0, 2);
}else if(type==1) {// 为1时是最大负荷的时间取值 示例为 tm=2019-1123
tm = String.valueOf(jltm.get("tm")).split("-")[1].substring(2, 4);
}else if(type==2) {// 为2时是电度电费的时间取值 示例为 tm=20191123
tm = String.valueOf(jltm.get("tm")).substring(6, 8);
}
String key = null;
if (j<10) {// 判断小于10时前面加0便于与原始数据截取的值对比
key = "0"+j;
}else {
key = String.valueOf(j);
}
if (tm.equals(key)) {// 判断嵌套循环的key和时间数据一致时赋值
DecimalFormat decimalFormat=new DecimalFormat("0.00");
map.put(key, decimalFormat.format(jltm.get("value")));// 根据前端需要字段存
}else{
if (map.get(key)=="-"||map.get(key)==null) {
map.put(key, "-");// 根据前端需要字段存
}
}
}
}
// 循环取值
for (int j = 1; j <= 31; j++) {
Map<String,Object> mm = new HashMap<String,Object>();// 定义map存值
String key = null;
if (j<10) {
key = "0"+j;
}else {
key = String.valueOf(j);
}
mm.put("tm", key);// 赋值key
mm.put("value", map.get(key));// 赋值值
mList.add(mm);// map的key不能重复,存到list里
}
return mList;
}
--有更好的处理方法请大神评论,源码审核中,通过加链接