2019-12-14

LIST排序

针对可以针对各种类型的集合进行排序
以下是运行的例子:
例子:
以下是结果:
结果

public class SortUtil {
	
/**
 * <pre>
 * 1 List里面为基本型 ==> freeSort(list,boolean)
 *   list: 要排序的list; boolean: true 升序,false 降序  	
 * 2 List里面为非基本型==> freeSort(list,param1,boolean,param2,boolean,param...,boolean) 
 *   list: 要排序的list; param:排序依赖的项目; 
 *   boolean: true 升序 ,false 降序
 * 全项目自由排序
 * @param list 排序的list
 * @param params 必要的参数
 */
	public static <C> void freeSort(List<C> list, final Object... params) {
		Collections.sort(list, new Comparator<C>() {
			@Override
			public int compare(C c1, C c2) {
				int sort = 0;
				Object obj1 = null;
				Object obj2 = null;
				try {
					if (params.length > 1) {
						for (int index = 0; index < params.length / 2; index++) {
							String param = (String) params[index * 2];
							String[] strArr = param.split("\\.");
							obj1 = getValue(c1, strArr);
							obj2 = getValue(c2, strArr);
							sort = getSortNum(obj1, obj2,(Boolean) params[index * 2 + 1]);
							if (sort != 0) {
								break;
							}
						}
					} else if (params.length == 1) {
						sort = getSortNum(c1, c2, (Boolean) params[0]);
					} else {
						throw new RuntimeException("入力的param数不足");
					}
				} catch (Exception e) {
					System.out.println("[freeSort] error:" + e.getMessage());
				}
				return sort;
			}
		});
	}
	
	/**
	 * <pre>
	 * 1 List里面为基本型 ==> sort(list,boolean)
	 *   list: 要排序的list; boolean: true 升序,false 降序  	
	 * 2 List里面为非基本型==> sort(list,param1,param2,param...,boolean) 
	 *   list: 要排序的list; param:排序依赖的项目; 
	 *   boolean: true 升序 ,false 降序
	 * 全项目排序
	 * @param list 排序的list
	 * @param params 必要的参数
	 */
		public static <C> void sort(List<C> list, final Object... params) {
			Collections.sort(list, new Comparator<C>() {
				@Override
				public int compare(C c1, C c2) {
					int sort = 0;
					Object obj1 = null;
					Object obj2 = null;
					try {
						if (params.length > 1) {
							for (int index = 0; index < params.length-1; index++) {
								String param = (String) params[index];
								String[] strArr = param.split("\\.");
								obj1 = getValue(c1, strArr);
								obj2 = getValue(c2, strArr);
								sort = getSortNum(obj1, obj2,(Boolean) params[params.length-1]);
								if (sort != 0) {
									break;
								}
							}
						} else if (params.length == 1) {
							sort = getSortNum(c1, c2, (Boolean) params[0]);
						} else {
							throw new RuntimeException("入力的param数不足");
						}
					} catch (Exception e) {
						System.out.println("[sort] error:" + e.getMessage());
					}
					return sort;
				}
			});
		}

	private static <C> Object getValue(Object obj, String[] src)throws Exception {
		for (int i = 0; i < src.length; i++) {
			Class<?> clazz = obj.getClass();
			String methodName = "get" + src[i].substring(0, 1).toUpperCase()+ src[i].substring(1);
			Method method = clazz.getMethod(methodName);
			obj = method.invoke(obj);
		}
		return obj;
	}

	private static int getSortNum(Object obj1, Object obj2, boolean order)throws Exception {
		int sort;
		if (obj1 != null && obj2 == null) {
			sort = 1;
		} else if (obj1 == null && obj2 != null) {
			sort = -1;
		} else if (obj1 == null && obj2 == null) {
			sort = 0;
		} else {
			Class<?> clazz = obj1.getClass();
			Method method = clazz.getMethod("compareTo", obj2.getClass());
			sort = (Integer) method.invoke(obj1, obj2);
		}
		return order ? sort : -sort;
	}
}

小白第一次写请多多指教

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值