根据传入的字段和排序规则对 list<T>进行排序

[个人笔记]

问题描述:根据实体类Demo的字段test进行排序

大概分为两步:使用反射获取类中的方法,使用Collections.sort()进行排序

1、使用反射获取类中的方法

//实体类Demo的相关代码就不写了,getter/setter什么的,知道其中有一个方法是getTest()就可以了


public list<Demo> getSort(List<Demo> list, String sidx, String order) throws Exception{

//开始通过传入字符串获取get方法
Demo demo = new Demo();
Class<? extends Demo> demoClass = Demo.getClass();
// 字符串首字母大写
char[] cs = sidx.toCharArray();
cs[0] -= 32;
Method method = demoClass.getMethod("get" + String.valueOf(cs));
/*调用invoke,获取值,demo只是表示放这个类型的参数,不代表具体含义,在下面的排序的时候会用到invoke方法,写在这里方便理解
Object invoke = method.invoke(demo);*/
}

2、进行排序操作,顺序就是o1-o2,倒序就是o2-o1

//实体类Demo的相关代码就不写了,getter/setter什么的,知道其中有一个方法是getTest()就可以了


public void getSort(List<Demo> list, String sidx, String order) throws Exception {

		// 排序操作
		if (null != sidx) {
			Demo demo = new Demo();
Class<? extends Demo> demoClass = demo.getClass();
// 字符串首字母大写
char[] cs = sidx.toCharArray();
cs[0] -= 32;
Method method = demoClass.getMethod("get" + String.valueOf(cs));

			Collections.sort(list, new Comparator<Demo>() {

				@Override
				public int compare(Demo o1, Demo o2) {
					int res = 0;
					try {
						if ("desc".equals(null == order ? "asc" : order)) {
					//此处看传入字段在实体类中是什么属性,然后将obj转化为对应类型,此处用bigdecimal示例		
							res = objToBigDecimal(method.invoke(o2)).compareTo(objToBigDecimal(method.invoke(o1)));
						} else {
							res = objToBigDecimal(method.invoke(o1)).compareTo(objToBigDecimal(method.invoke(o2)));
						}
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (InvocationTargetException e) {
						e.printStackTrace();
					}
					return res;
				}
			});
		}
	}

/**
	 * obj转BigDecimal
	 * @param value
	 * @return BigDecimal
	 */
	public BigDecimal objToBigDecimal(Object value) {
		BigDecimal ret = null;
		if (value != null) {
			if (value instanceof BigDecimal) {
				ret = (BigDecimal) value;
			} else if (value instanceof String) {
				ret = new BigDecimal((String) value);
			} else if (value instanceof BigInteger) {
				ret = new BigDecimal((BigInteger) value);
			} else if (value instanceof Number) {
				ret = new BigDecimal(((Number) value).doubleValue());
			} else {
				throw new ClassCastException("Not possible to coerce [" + value + "] from class " + value.getClass()
						+ " into a BigDecimal.");
			}
		}
		return ret;
	}

至此,可以完成根据传入的字段进行排序的要求,好像一般是前端排序,这个好像有点不实用,但是,也写一下,记录一下,看到这篇笔记的筒子们也可以试试前端排序,比这个方便一点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值