Java中Comparator的示例

业务需求:

先按参与人数降序,再按排名之和升序

人数:perTotal ,排名之和:rankTotal

完整代码:

	@Override
	public 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>() {

				@Override
				public 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>() {

				@Override
				public 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>(){
			/**
			 * 先按参与人数降序,再按排名之和升序
			 */
			@Override
			public 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>(){
			/**
			 * 先按参与人数降序,再按排名之和升序
			 */
			@Override
			public 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;
					}
				}
			}

		});
时间: 2024-10-21 07:20:04

Java中Comparator的示例的相关文章

Java中Comparator接口

Comparator位于java.util包下 public interface Comparator<T> 强行对某个对象 collection 进行整体排序 的比较函数.可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制.还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序. 当且仅当对于一组

java中JDBC应用示例实验

一.先下载mysql-connector-java-x.x.x-bin.jar包 下载mysql-connector-java-x.x.x-bin.jar,目前最新版为mysql-connector-java-5.1.22-bin.jar.( 在Eclipse中,选择 项目->属性->Java构建路径,在"库"选项卡中,选择"添加外部JAR",找到下载的mysql-connector-java-5.1.22-bin.jar文件,将其添加进项目. 再次编译

跟王老师学集合(十一)java中Comparator的用法

Java中Comparator的用法 主讲人:王少华  QQ群号:483773664 在java中,如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标. 接下来我们模拟下在集合对象中对日期属性进行排序 一.实体类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package chapter07_11; public class Person {     private int a

java中Comparator的用法 -- 实现集合和数组排序

在java中,如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标. 接下来我们模拟下在集合对象中对日期属性进行排序 一.实体类Step package com.ljq.entity; /** * */public class Step{ /** 时间 */ private String acceptTime = ""; /** 地点 */ private String acceptAddress = ""; public Ste

使用Java中Comparator接口实现自定义排序

一般情况下,自己动手写一个简单排序程序还是没有问题的,但是你能保证写出来的排序程序的时间复杂度吗?你能保证程序的正确性吗,鲁棒性呢,还有程序结构的清晰性,可维护性.......综上所述,学习一下排序接口来实现对复杂对象的排序还是很有必要的.Java中有两个用来实现排序的接口Comparator和Comparable接口,本人比较喜欢使用java的Comparator接口,在程序里实现Comparator接口里的compare(Object o1,Object o2)方法,然后在程序中通过调用Ar

java中Comparator 和 Comparable的区别

1.Comparable的代码如下: public interface Comparable<T> { public int compareTo(T o); } 2.Comparator的代码如下 public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); // jdk1.8 后的方法 default Comparator<T> reversed() { re

JAVA中Comparator的使用

关于Collections中的sort方法的使用   在java中,如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标. 此排序被保证是稳定的:不会因调用 sort 方法而对相等的元素进行重新排序. 举个例子: 定义一个User类,内有name和score两个属性. 定义一个ArryList,其内部元素为User对象,如何按照User的score进行升序排序? //声明User类型 public class User { public String name

Java 中Comparator 的使用,实现集合排序

目标:实现对Person 对象的年龄,从小到大排序 1.实现排序 1 package com.app; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 import java.util.List; 7 8 public class A1 extends B{ 9 10 public static void main(String[] args) { 1

Java中Comparator比较器的使用

说几点需要注意的,提醒自己即可: 以下是单独定义一个比较器的类,实现了Comparator中的compare方法.(要在Main方法外面定义类噢) 一定是compare而不是Compare哦 package xixixi; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt()