当某些实体类不方便重写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();
}
}