java自定义排序规则
背景:开发的一个查询功能,主要字段:账号、币种等,业务提供了一个显示顺序,没有什么规则的排序,例如 3,1,6,2 无规则的顺序
思路:通过提供的顺序来指定排序规则
代码:
一
/**通过提供的顺序,把他们放在list中,表中主键是账号和币种,我就把他们联合起来,这样list中就不会有重复的,就能保证他们的顺序是唯一的*/
List<String> acctOrder = Arrays.asList("1235564-USD", "8524526-JPY", "9652485-CAD");
二
/**排序方法的入口*/
private void sortResult(List<T> resultlist) {
Collections.sort(resultlist, new AcctComparator());
}
三
/**自定义一个比较器,T 为比较的类型,可以是String,Integer,也可以是自己定义的对象类型*/
private class AcctComparator implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
int index1 = acctOrder.indexOf(o1.getActAcct() + "-" + o1.getCcy());
int index2 = acctOrder.indexOf(o2.getActAcct() + "-" + o2.getCcy());
/* 如果都不在排序的list中,按照 账号-币种 排序 ,如果不做此判断,当他们都是-1时,可能会报:comparison method violates its general contract(违反了比较方法的一般约定)*/
if (index1 == -1 && index2 == -1) {
return (o1.getActAcct() + "-" + o1.getCcy()).compareTo(o2.getActAcct() + "-" + o2.getCcy());
/* 如果o1不在,放后面 */
} else if (index1 == -1) {
return 1;
/* 如果o2不在,放前面 */
} else if (index2 == -1) {
return -1;
/* 如果都存在,按照所在的顺序排序 */
} else {
return Integer.compare(index1, index2);
}
}
}
总结:通过自定义的排序规则,这样就可以给查到的数据排序了。不过如果是分页查的数据,一定要先查出所有的数据,通过此方法排序后自己去截取数组返回,不然查的数据已经分页过,再排序是没有意义的。