controller返回已经排序的json数据,前端遍历时却顺序错乱

我用的是ssm框架,mybatis框架返回不固定对象时,resultType需要写成 java.util.Map,对应的接受类为List<Map<String, Object>>

尽管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<MapChangeList>>类型,因为map类型传到前端永远是无序的,只有list才是有序的。所以此方法有两个功能,1.将List<Map<String,Object>>类型转变为List<List<MapChangeList>>类型,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;
    }

}

有更好的处理此错误的方式的朋友还请留下链接参考,谢谢
17点14分

猜你喜欢

转载自blog.csdn.net/bc_aptx4869/article/details/80540520
今日推荐