java反射练习 对集合中元素 按照方法进行排序

Wesley13
• 阅读 728

/** * 对集合中元素按照指定方法进行排序 * * @param list 需要排序的集合 * @param property 时间对象在集合对象中属性名称 * @param method 排序字段get方法 * @param reverse 是否倒序 */ public static void sortByMethod(List list, final String property, final String method, final boolean reverse) { Collections.sort(list, new Comparator() { public int compare(Object arg1, Object arg2) { int result = 0; if (arg1 == null || arg2 == null) { return 0; }

        try {
            Field property1 = (arg1).getClass().getDeclaredField(property);
            if(!property1.isAccessible()){
                property1.setAccessible(true);
            }

            // 获取时间对象
            Object object1 = property1.get(arg1);

            Field property2 = (arg2).getClass().getDeclaredField(property);
            if(!property2.isAccessible()){
                property2.setAccessible(true);
            }
            // 获取时间对象
            Object object2 = property2.get(arg2);

            Method m1 = object1.getClass().getMethod(method, null);
            Method m2 = object2.getClass().getMethod(method, null);

            Object obj1 = m1.invoke(object1, null);
            Object obj2 = m2.invoke(object2, null);

            if (obj1 instanceof String) {
                // 字符串
                result = obj1.toString().compareTo(obj2.toString());
            } else if (obj1 instanceof Date) {
                // 日期类型
                if (obj1 == null || obj2 == null) {
                    return 0;
                }

                long time = ((Date) obj1).getTime() - ((Date) obj2).getTime();
                if (time > 0) {
                    result = 1;
                } else if (time < 0) {
                    result = -1;
                } else {
                    result = 0;
                }
            } else if (obj1 instanceof Short) {
                result = (Short) obj1 - (Short) obj2;
            }

            if (reverse) {
                // 倒序
                result = -result;
            }

        } catch (NoSuchMethodException e) {
            logger.error("获取对象方法出错,对象中没有当前方法 == >> " + e.toString(), e);
        } catch (IllegalAccessException iae) {
            logger.error("获取对象属性权限出错 == >> " + iae.toString(), iae);
        } catch (InvocationTargetException ite) {
            logger.error("此处接收被调用方法内部未被捕获的异常 == >> " + ite.toString(), ite);
        } catch (NoSuchFieldException e) {
            logger.error("获取对象属性出错,对象中没有当前属性 == >> " + e.toString(), e);
        }

        return result;
    }
});

}

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
执键写春秋 执键写春秋
3年前
Java中集合排序常用的方式
1.集合排序概述1.1集合排序的主要内容:集合中的级别数据类型排序集合中的字符串排序Comparator接口Comparable接口1.2数组排序回顾intarr12,25,22,17,89,22;Arrays.sort(arr);输出:12,17,22,22,25,89Java的Arrays类中有一个sort()方法,该方法是Ar
大厂Java初级开发工程师!!!面试必问项之Set实现类:TreeSet
一、TreeSet概述1、TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。2、TreeSet顾名思义他内部维护的是一个TreeMap,底层是红黑二叉树,他使得集合内都是有序的序列。  3、Tree可以按照添加对象的指定属性,进行排序,所以向TreeSet中添加的数据,要求是相同类的对象。4、两
Wesley13 Wesley13
3年前
java 数据结构(十二):Collections工具类的使用
Collections工具类1.作用:操作Collection和Map的工具类2.常用方法:reverse(List):反转List中元素的顺序shuffle(List):对List集合元素进行随机排序sort(List):根据元素的自然顺序对指定List集合元素升序排序sort(List,Comparator)
Wesley13 Wesley13
3年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
执键写春秋 执键写春秋
3年前
Java练习(三)——返回集合中的最大的和最小的元素
题目:在一个列表中存储以下元素:apple,grape,banana,pear,现要求将集合进行排序,返回集合中的最大的和最小的元素,并将排序后的结果打印在控制台上,要求的打印输出方法分别为默认toString输出、迭代器输出、for循环遍历输出和增强for循环输出。packagetest;importjava.util.;publicclassP
Wesley13 Wesley13
3年前
java.lang.Comparable
Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的_自然排序_,类的compareTo方法被称为它的_自然比较方法_。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
Stella981 Stella981
3年前
List自定义对象的排序,根据对象的某一列进行排序
  在工作中,经常需要对List对象集合进行排序操作,下面总结下搞个通用排序对象,原理是使用JAVA的    Comparator  接口实现排序  不多说直接上“干货”1、存在实体类:1@Data2@AllArgsConstructor3@NoArgsConstructo
Stella981 Stella981
3年前
Comparator和Comparable
12\.比较器java.util接口Comparator集合具有比较特性。强行对某个对象collection进行整体排序的比较函数。可以将Comparator传递给sort方法(如Collections.sort或Arrays.sort)