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);
}
}
最终的效果: