天天看点

Collections.sort的使用

1、首先确定list所存储的类型,比如List<Map<String,Object>>,那么使用Collections.sort()方法,new Comparator<与List存储的类型保持一致>,如下示例
Collections.sort(list, new Comparator<Map<String,Object>>(){
    @Override
    public int compare(Map<String,Object> o1, Map<String,Object> o2) {
        long tmp = Long.parseLong(String.valueOf(o1.get("num")));
        long tmp2 = Long.parseLong(String.valueOf(o2.get("num")));
        return tmp>tmp2?-1:1;
    }
});      

说明:o1和o2代表我们所要对比的两个对象,这两个对象都来自list当中

如:

List<Map<String,Object>> list = new ArrayList<>();   
list.add("num",4); // 这个类型可以是Long类型,也可以是Integer类型,都可以用来做运算
list.add("num",2);
list.add("num",3);
      

Collections.sort方法中的compare方法,底层实现是使用循环来对每两个值进行比对。比如第一次进入该方法,o1获取到num的值是4,o2获取到的值是2,

那么会将二者进行比对并返回,之后在4和3对比、2和3比对,最后进行排序。我这边是降序,从大到小~~~

下面我把我的代码贴进来提供参考:

/**
 * 需求:产品销售排行
 *
 * @param startTime 开始时间
 * @param endTime   结束时间
 * @return
 */
@RequestMapping(value = "/productSalesRanking", method = RequestMethod.POST)
@ResponseBody
public Object productSalesRanking(String startTime, String endTime) {
    List<Map<String,Object>> list = new ArrayList<>();
    try {
        // 不传时间获取当日时间
        TimeVerification timeVerification = new TimeVerification(startTime, endTime).invoke();
        if (timeVerification.is())
            return new BaseController().renderStatus(false, "时间格式错误,请使用yyyy-MM-dd", null);
        startTime = timeVerification.getStartTime();
        endTime = timeVerification.getEndTime();

        // 查询分组中的所有saleModel
        List<Map<String,Object>> modelList = dmTicketSalesDataService.selectSaleModels();
        // 根据起始时间查询周期范围内,saleModel(售票途径)对应的票数,并根据对应种类票数进行从多到少排序
        List<Map<String, Object>> mapList = dmTicketSalesDataService.selectProductSalesRanking(startTime, endTime);
        for (int i = 0;i < modelList.size();i++){
            String iModel = (String)modelList.get(i).get("saleModel");
            Map<String,Object> modelMap = new HashMap<>();
            String jModel = null;
            for (int j = 0;j < mapList.size();j++){
                jModel = (String)mapList.get(j).get("saleModel");
                Long num = (Long)mapList.get(j).get("num");
                if (iModel.equals(jModel)){
                    modelMap.put("saleModel",iModel);
                    modelMap.put("num",num);
                    break;
                }
            }
            if (!iModel.equals(jModel)) {
                modelMap.put("saleModel",iModel);
                modelMap.put("num",0);
            }
            list.add(modelMap);
            Collections.sort(list, new Comparator<Map<String,Object>>(){
                @Override
                public int compare(Map<String,Object> o1, Map<String,Object> o2) {
                    // 注意:这里不能直接转,需要先转String,再转long类型
                    long tmp = Long.parseLong(String.valueOf(o1.get("num")));
                    long tmp2 = Long.parseLong(String.valueOf(o2.get("num")));
                    return tmp>tmp2?-1:1;
                }
            });
        }

        if (list == null || list.isEmpty()) {
            return new BaseController().renderStatus(false, "产品销售数据不能为空!", null);
        }
        return new BaseController().renderStatus(true, "查询成功!", list);
    } catch (Exception e) {
        logger.error("产品销售排行有误!", e);
        return new BaseController().renderStatus(false, "接口异常", e);
    }
}      

最终的效果:

Collections.sort的使用

继续阅读