一种实用的通用比较器

当某些实体类不方便重写compareTo时,需要用到第三方比较器,为避免代码冗杂,有必要将其抽出,做成通用的。
示例main中的实体类就不提供了,自己随便编一个就可以测试了。
如下:

/**
 * @author 李
 * @version 1.0
 * @className CurrencyComparator
 * @date 2021/6/4
 * @description 通用比较器,降低代码侵入性,待排序对象不须重写compareTo,
 * 调用示例见main, 支持list和数组排序
 */

public class CurrencyComparator<T> implements Comparator<T> {
    private String field;
    private String[] fields;

    @Override
    public int compare(T o1, T o2) {
        boolean flag = false;
        int inter = 0;
        String str1;
        String str2;
        try {
            if (!StringUtils.isEmpty(field)) {//单字段比较
                str1 = getAttribute(o1, field);
                str2 = getAttribute(o2, field);
                inter = str1.compareTo(str2);
            } else if (fields != null && fields.length > 0) {//多字段依次比较
                for (String key : fields) {
                    this.field = key;
                    str1 = getAttribute(o1, key);
                    str2 = getAttribute(o2, key);
                    inter = str1.compareTo(str2);
                    if (inter != 0) {//前参数相等时才比较下一个参数,否则跳出
                        break;
                    }
                }
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            flag = true;
            e.printStackTrace();
        } finally {
            if (flag) {
                throw new MyException(10000, "创建比较器失败,未找到该字段" + field);
            }
        }
        return inter;
    }

    public static void main(String[] args) {
        List<Mailbox> list = new ArrayList<>(16);
        for (int i = 0; i < 10; i++) {
            Mailbox mailbox = new Mailbox();
            if (i % 2 == 0) {
                mailbox.setTitle("高原");
                mailbox.setSendMail(String.valueOf(i));
            } else {
                mailbox.setTitle("ping原");
                mailbox.setSendMail(String.valueOf(i));
            }
            list.add(mailbox);
        }
        System.out.println(list);
        //集合排序
        //Collections.sort(list,new CurrencyComparator<Mailbox>("title"));
        //System.out.println(list);
        Mailbox[] mailboxes = list.toArray(new Mailbox[0]);
        //数组排序
        /*Arrays.sort(mailboxes,new CurrencyComparator<Mailbox>("title"));
        System.out.println(Arrays.toString(mailboxes));*/
        //多参数排序
        String[] sirs = new String[]{"title", "sendMail"};
        Arrays.sort(mailboxes, new CurrencyComparator<Mailbox>(sirs));
        System.out.println(Arrays.toString(mailboxes));
    }
    /**
     *
     * 功能描述:单参数比较器
     * @Author 李
     * @MethodName CurrencyComparator
     * @Date 21:12 2021/6/4
     * @param filed 用于比较的字段
     * @return
     * @exception
     **/
    public CurrencyComparator(String filed) {
        this.field = filed;
    }
    /**
     *
     * 功能描述:多参数比较器
     * @Author 李
     * @MethodName CurrencyComparator
     * @Date 21:11 2021/6/4
     * @param filedEs 用于比较的字段数组
     * @return
     * @exception
     **/
    public CurrencyComparator(String[] filedEs) {
        this.fields = filedEs;
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String[] getFields() {
        return fields;
    }

    public void setFields(String[] fields) {
        this.fields = fields;
    }
    /**
     * 功能描述:反射获取指定对象指定属性值
     *
     * @param t   对象
     * @param key 键名
     * @return java.lang.String
     * @throws
     * @Author 李
     * @MethodName get
     * @Date 14:03 2021/6/4
     **/
    public static <T> String getAttribute(T t, String key) throws NoSuchFieldException, IllegalAccessException {
        Class classes = t.getClass();
        Field field = classes.getDeclaredField(key);
        field.setAccessible(true);
        Object hisValue = field.get(t);
        return hisValue.toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值