Java中Comparator的示例
来源:互联网 发布:protel软件下载流程 编辑:程序博客网 时间:2024/06/06 07:26
业务需求:
先按参与人数降序,再按排名之和升序
人数:perTotal ,排名之和:rankTotal
完整代码:
@Overridepublic JSONObject getTopUnitOfGameRanking(List<Map<Long, Integer>> userMap,int limit) {JSONObject json = new JSONObject();List<JSONObject> list = new ArrayList<JSONObject>();List<JSONObject> lists = new ArrayList<JSONObject>();List<Long> userIds = new ArrayList<Long>();for(Map<Long, Integer> userRanking : userMap){for(Long userId : userRanking.keySet()){userIds.add(userId);}}if (userIds != null && userIds.size() > 0) {List<Object> param = new ArrayList<Object>();StringBuilder builder = new StringBuilder();builder.append("select unit_id,count(user_id) as pertotal from t_user_expand where unit_id !=0 and user_id in ( ");for (int i = 0; i < userIds.size(); i++) {if (i != 0) {builder.append(",");}builder.append("?");param.add(userIds.get(i));}builder.append(" ) GROUP BY unit_id order by pertotal desc limit ? ");param.add(limit);//final List<Long> unitIds = new ArrayList<Long>();list = primaryJdbcTemplate.query(builder.toString(), param.toArray(),new RowMapper<JSONObject>() {@Overridepublic JSONObject mapRow(ResultSet rs, int rowNum) throws SQLException {JSONObject o = new JSONObject();o.put("unitId", rs.getLong("unit_id"));o.put("perTotal", rs.getLong("pertotal"));return o;}});List<Object> params = new ArrayList<Object>();StringBuilder builders = new StringBuilder();builders.append("select unit_id,user_id from t_user_expand where unit_id !=0 and user_id in( ");for (int i = 0; i < userIds.size(); i++) {if (i != 0) {builders.append(",");}builders.append("?");params.add(userIds.get(i));}builders.append(" ) limit ? ");params.add(limit);lists = primaryJdbcTemplate.query(builders.toString(), params.toArray(),new RowMapper<JSONObject>() {@Overridepublic JSONObject mapRow(ResultSet rs, int rowNum) throws SQLException {JSONObject o = new JSONObject();o.put("unitId", rs.getLong("unit_id"));o.put("user_id", rs.getLong("user_id"));return o;}});for(JSONObject obj : lists){ // 遍历 “用户id”关联的“府id”for(Map<Long, Integer> user : userMap){ //由“用户id”获取对应的排名Integer rank =user.get(obj.get("user_id"));if(null == rank){rank = 0;}for(JSONObject object : list){if(((Long)object.get("unitId")).compareTo((Long)obj.get("unitId"))==0){Integer oldRankTotal = (Integer)object.get("rankTotal");if(null == oldRankTotal){oldRankTotal = 0;}object.put("rankTotal", oldRankTotal + rank);}}}}}Collections.sort(list, new Comparator<JSONObject>(){/** * 先按参与人数降序,再按排名之和升序 */@Overridepublic int compare(JSONObject o1, JSONObject o2) {Long perTotal1 = (Long)o1.get("perTotal");Long perTotal2 = (Long)o2.get("perTotal");Integer rankTotal1 = (Integer)o1.get("rankTotal");Integer rankTotal2 = (Integer)o2.get("rankTotal");if(perTotal1.compareTo(perTotal2) > 0){return -1;}else if(perTotal1.compareTo(perTotal2) < 0){return 1;}else{if(rankTotal1.compareTo(rankTotal2) > 0){return 1;}else if(rankTotal1.compareTo(rankTotal2) < 0){return -1;}else{return 0;}}}});json.put("data", list);return json;}
关键部分代码(在人数相同的情况下,比较排名之和):
List<JSONObject> list = new ArrayList<JSONObject>();Collections.sort(list, new Comparator<JSONObject>(){/** * 先按参与人数降序,再按排名之和升序 */@Overridepublic int compare(JSONObject o1, JSONObject o2) {Long perTotal1 = (Long)o1.get("perTotal");Long perTotal2 = (Long)o2.get("perTotal");Integer rankTotal1 = (Integer)o1.get("rankTotal");Integer rankTotal2 = (Integer)o2.get("rankTotal");if(perTotal1.compareTo(perTotal2) > 0){return -1;}else if(perTotal1.compareTo(perTotal2) < 0){return 1;}else{if(rankTotal1.compareTo(rankTotal2) > 0){return 1;}else if(rankTotal1.compareTo(rankTotal2) < 0){return -1;}else{return 0;}}}});
0 0
- Java中Comparator的示例
- java中Comparator的用法
- java中Comparator的用法
- java中Comparator的用法
- java中Comparator的用法
- java中Comparator的用法
- java中Comparator的用法
- java中Comparator的用法
- java中Comparator的用法
- java中Comparator的用法
- Java中Comparator的用法
- Java中Comparator的用法
- java.util.Comparator使用示例
- java.util.Comparator使用示例
- Java 8 Lambda : Comparator 示例
- Java 8 Lambda : Comparator 示例
- Java 8 Lambda : Comparator 示例
- java中comparable和 comparator的区别
- 【图解HTTP笔记】第一章 了解Web及网络基础
- n电p空
- 66^3 工作室作品展示之:绿意满屋
- JAVA 文件存储、写入
- linux下zip文件、7z文件的解压和压缩
- Java中Comparator的示例
- 二、友录项目-联系人界面搭建
- 文章标题
- 专题三1016
- Leetcode 061 Rotate List
- SQLSERVER2008 R2的端口设置
- sip呼叫里SDP的一些字段的含义
- Spark 定制版:003~Spark Streaming(三)
- bananapro 安装FLASH