controller返回已经排序的json数据,前端遍历时却顺序错乱
- mybatis框架返回不固定对象时,resultType需要写成
java.util.Map
,对应的接受类为List>
- 尽管sql语句里已经排序了,但是查询出来之后顺序早已乱掉。
- 下面我通过两个方法实现了对返回结果的排序,因为这个需求是一维数组和二维数组都要排序。
- 一个重要的地方就是不要返回map,因为返回的map无论是HashMap还是TreeMap,前端拿到之后都是无序的。
The first step
-
controller代码
-
@RequestMapping("/address") @ResponseBody public ResponseMessage showPlaceStatisticsTable( @RequestBody ShowPlaceTableQueryParam showPlaceQueryParam, HttpSession session){ List<Map<String, Object>> maps = statisticsService.showPlaceTableQuery(showPlaceQueryParam);//调用mybatis的mapper.xml里的查询方法 maps = MapKeyComparator(maps);对返回的list里的每一个map根据key进行排序,返回结果是一个无序的list,但是list里的map里的key是有序的。 List<List<MapChangeList>> lists = mapChangeToList(maps); message.setData(lists); message.setCode(ResponseConstants.OK); message.setMsg("查询成功"); return message; }
Second steps
-
编写
MapKeyComparator
方法 -
/** * 表格统计数据省份比较器 */ public List<Map<String,Object>> MapKeyComparator(List<Map<String,Object>> maps){ Map<String, Integer> compare = new TreeMap<>();//用来对应传入参数`maps`里的每一个key对应的数字 compare.put("YEAR",1); compare.put("MONTH",1); compare.put("地点和时间",1); compare.put("合计",2); compare.put("TOTAL",2); compare.put("北京市",3); compare.put("天津市",4); compare.put("河北",5); compare.put("山西",6); compare.put("内蒙古自治区",7); compare.put("辽宁",8); compare.put("吉林",9); compare.put("黑龙江",10); compare.put("上海市",11); compare.put("江苏",12); compare.put("浙江",13); compare.put("安徽",14); compare.put("福建",15); compare.put("江西",16); compare.put("山东",17); compare.put("河南",18); compare.put("湖北",19); compare.put("湖南",20); compare.put("广东",21); compare.put("广西壮族自治区",22); compare.put("海南",23); compare.put("重庆市",24); compare.put("四川",25); compare.put("贵州",26); compare.put("云南",27); compare.put("西藏自治区",28); compare.put("陕西",29); compare.put("甘肃",30); compare.put("青海",31); compare.put("宁夏回族自治区",32); compare.put("新疆维吾尔自治区",33); compare.put("台湾",34); compare.put("香港",35); compare.put("澳门",36); List<Map<String,Object>> stringObjectMapFirst = new ArrayList<>(); for (int i = 0; i < maps.size(); i++) { Map<String, Object> stringObjectMap = new TreeMap<String, Object>(new Comparator<String>() { @Override public int compare(String o1, String o2) { Integer integer = compare.get(o1); Integer integer1 = compare.get(o2); if(null == integer){//预防获取不到key值 integer = 0; } if(null == integer1){ integer1 = 0; } return integer.compareTo(integer1);//降序排列 } }); stringObjectMap.putAll(maps.get(i)); stringObjectMapFirst.add(stringObjectMap); } return stringObjectMapFirst; }
Third steps
-
需要先将List<Map<String,Object>>类型转变为List<List>类型,因为map类型传到前端永远是无序的,只有list才是有序的。所以此方法有两个功能,1.将List<Map<String,Object>>类型转变为List<List>类型,2.将list排序。//MapChangeList类里只有两个属性,一个string类型,一个object类型,会贴在最后。
-
/** * map转list,并排序 */ public List<List<MapChangeList>> mapChangeToList(List<Map<String,Object>> maps){ List<List<MapChangeList>> lists = new ArrayList<>(); for (int i = 0; i < maps.size(); i++) { List<MapChangeList> mapChangeLists = new ArrayList<>(); Map<String, Object> stringObjectMap = maps.get(i); Iterator it = stringObjectMap.keySet().iterator(); while (it.hasNext()) { MapChangeList mapChangeList = new MapChangeList(); String key = it.next().toString(); Object o = stringObjectMap.get(key); mapChangeList.setKey(key); mapChangeList.setValue(o); mapChangeLists.add(mapChangeList); } lists.add(mapChangeLists); } //上方代码已完转换list,下方是对二维list进行排序 Collections.sort(lists, new Comparator<List<MapChangeList>>() { @Override public int compare(List<MapChangeList> o1, List<MapChangeList> o2) { return o1.get(0).getValue().hashCode() - o2.get(0).getValue().hashCode();//这里是因为由于第一个方法将所有的月份或者年份都排到了下标为0的位置,所以直接比对哈希值即可了。。。。具体逻辑具体分析嘛 } }); return lists; }
-
辅助类 MapChangeList :
-
public class MapChangeList implements Serializable{ private static final long serialVersionUID = 7756822135607139301L; private String key; private Object value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } }