天天看點

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的使用

繼續閱讀