自定义通用排序

3 篇文章 0 订阅

定义排序注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Order {

    /**
    * 功能描述:排序优先级,按照值大小,由小到大排序
    * @author konglcwqy
    * @date 2022/6/6 15:15
    * @param
    * @return int
    */
    public int value();

排序核心

static class OrderHelper {

        /**
         * 功能描述:按照@Order排序集合
         *
         * @param list
         * @param customerOrder
         * @return void
         * @author konglcwqy
         * @date 2022/6/6 10:47
         */
        public static <T> void sort(List<T> list,CustomerOrder customerOrder) {
            if (list.isEmpty()) {
                return;
            }
            Field[] fields = list.get(0).getClass().getDeclaredFields();
            if (fields == null || fields.length == 0) {
                return;
            }
            final TreeMap<Integer, Field> map = new TreeMap<Integer, Field>();
            Order order = null;
            for (Field field : fields) {
                order = field.getDeclaredAnnotation(Order.class);
                if (order != null) {
                    map.put(order.value(), field);
                }
            }
            if (map.size() > 0) {
                list.sort(new Comparator<T>() {
                    public int compare(T o1, T o2) {
                        return OrderHelper.sort(o1, o2, map,customerOrder);
                    }
                });
            }
        }

        /**
         * 功能描述:排序
         *
         * @param o1
         * @param o2
         * @param map
         * @param customerOrder
         * @return int
         * @author konglcwqy
         * @date 2022/6/6 10:59
         */
        private static <T> int sort(T o1, T o2, TreeMap<Integer, Field> map,CustomerOrder customerOrder) {
            try {
                if (map == null || map.size() == 0) {
                    return 0;
                }
                Collection<Field> values = map.values();
                Object value1 = null;
                Object value2 = null;
                for (Field field : values) {
                    field.setAccessible(true);
                    value1 = field.get(o1);
                    value2 = field.get(o2);
                    //空值放后
                    if (value1 == null) {
                        return 1;
                    }
                    if (value2 == null) {
                        return -1;
                    }
                    //程序扩展,用户自定义
                    if(customerOrder != null){
                        Object[] customerOrderResult = customerOrder.getOrder(field, value1, value2);
                        if(customerOrderResult != null && customerOrderResult.length ==2){
                            value1 = customerOrderResult[0];
                            value2 = customerOrderResult[1];
                        }
                    }
                    //细化
                    if (value1 instanceof Integer) {
                        int result = Integer.compare(Integer.parseInt(value1.toString()), Integer.parseInt(value2.toString()));
                        if (result != 0) {
                            return result;
                        }
                    } else if (value1 instanceof Long) {
                        int result = Long.compare(Long.parseLong(value1.toString()), Long.parseLong(value2.toString()));
                        if (result != 0) {
                            return result;
                        }
                    } else if (value1 instanceof Double) {
                        int result = Double.compare(Double.parseDouble(value1.toString()), Double.parseDouble(value2.toString()));
                        if (result != 0) {
                            return result;
                        }
                    } else if (value1 instanceof Float) {
                        int result = Float.compare(Float.parseFloat(value1.toString()), Float.parseFloat(value2.toString()));
                        if (result != 0) {
                            return result;
                        }
                    } else if (value1 instanceof Short) {
                        int result = Short.compare(Short.parseShort(value1.toString()), Short.parseShort(value2.toString()));
                        if (result != 0) {
                            return result;
                        }
                    } else if (value1 instanceof Byte) {
                        int result = Byte.compare(Byte.parseByte(value1.toString()), Byte.parseByte(value2.toString()));
                        if (result != 0) {
                            return result;
                        }
                    } else if (value1 instanceof Date) {
                        Date d1 = (Date)value1;
                        Date d2 = (Date)value2;
                        long result = d1.getTime() - d2.getTime();
                        if (result > 0) {
                            return 1;
                        }
                        if (result < 0) {
                            return -1;
                        }
                    } else {
                        if (value1.hashCode() - value2.hashCode() != 0) {
                            return value1.hashCode() - value2.hashCode();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0;
        }
    }

客户自定义排序规则

 /**
    * 功能描述:用户自定义顺序
    * @author konglcwqy
    * @date 2022/6/6 14:40
    * @param
    * @return
    */
    static interface CustomerOrder{

        /**
        * 功能描述:获取修改后的值
        * @author konglcwqy
        * @date 2022/6/6 14:46
        * @param field
        @param v1
        @param v2
        * @return java.lang.Object[]
        */
        public Object[] getOrder(Field field,Object v1,Object v2);

    }

使用示例

public static void main(String[] args) {
            List<GxdwOfZrmjOutputDTO> list = new ArrayList<GxdwOfZrmjOutputDTO>();
            GxdwOfZrmjOutputDTO b1 = new GxdwOfZrmjOutputDTO();
            b1.setHylb("A");
            b1.setGajgmc("a");

            GxdwOfZrmjOutputDTO b2 = new GxdwOfZrmjOutputDTO();
            b2.setHylb("A");
            b2.setGajgmc("a");

            GxdwOfZrmjOutputDTO b3 = new GxdwOfZrmjOutputDTO();
            b3.setHylb("B");
            b3.setGajgmc("a");

            GxdwOfZrmjOutputDTO b4 = new GxdwOfZrmjOutputDTO();
            b4.setHylb("C");
            b4.setGajgmc("a");

            CustomerOrder order = new CustomerOrder() {
                @Override
                public Object[] getOrder(Field field, Object v1, Object v2) {
                    Integer r1 = v1.equals("C") ? 1 : 2;
                    Integer r2 = v2.equals("C") ? 1 : 2;
                    return new Object[]{r1,r2};
                }
            };

            list.add(b1);
            list.add(b2);
            list.add(b3);
            list.add(b4);
            OrderHelper.sort(list,order);
            System.out.println(123);
        }

完整代码下载地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值