因工作中遇到过一些比较麻烦的排序,公司有自己的排序规则,所以需要自定义排序,在此做个记录,希望有人能用到.(所有内容都在附件里面,项目可以直接运行测试)
1首先,自定义比较器,里面有固定排序,如下:
/**
* 自定义的比较器
*
* 自定义区域排序:1-华北地区,2-华东地区,3-华南地区,4-华中地区,5-西南地区,6-西北地区,7-东北地区
* 优先级由高到低,"1"的优先级最高,"7"的优先级最低
* @return
*/
@SuppressWarnings("rawtypes")
public static Comparator customRegionSort() {
String[] defined = { "华北地区", "华东地区", "华南地区", "华中地区", "西南地区", "西北地区", "东北地区" };
final List<String> definedOrder = Arrays.asList(defined);
Comparator cs = new Comparator(){
public int compare(Object property1, Object property2) {
int io1 = definedOrder.indexOf(property1);
int io2 = definedOrder.indexOf(property2);
return io1 - io2;
}
};
return cs;
}
第二步,写测试方法
1.对象属性自定义排序测试
/**
* 描述:多条件排序(对象属性排序)
*/
@SuppressWarnings({ "unchecked", "rawtypes"})
public static void objAttrSortTest() {
UserInfo u1 = new UserInfo("11","xiaoming","上海市","华南地区");
UserInfo u2 = new UserInfo("14","wanghong","北京市","华北地区");
UserInfo u3 = new UserInfo("17","zhongguo","济南市","西北地区");
UserInfo u4 = new UserInfo("18","zhongHua","济南市","华东地区");
UserInfo u5 = new UserInfo("20","zhongHua","济南市","华东地区");
List<UserInfo> ul = new ArrayList<UserInfo>();
ul.add(u1);ul.add(u2);ul.add(u3);ul.add(u4);ul.add(u5);
ArrayList<Object> sortFields = new ArrayList<Object>();
Comparator customRegionSort = customRegionSort();
//汉字排序,按a-z字母排序
Comparator comparator = Collator.getInstance(java.util.Locale.CHINA);
//数字排序,从低到高(也有从高到低)
Comparator mycmp1 = ComparableComparator.getInstance();
mycmp1 = ComparatorUtils.nullLowComparator(mycmp1);
//字母排序,按z-a字母排序
Comparator highToLow = ComparableComparator.getInstance();
highToLow = ComparatorUtils.nullHighComparator(highToLow);//倒序
//sortFields使用add方法添加排序,优先级逐渐降低
sortFields.add(new BeanComparator("region", customRegionSort)); //优先级-高
sortFields.add(new BeanComparator("city", comparator)); //优先级-高
sortFields.add(new BeanComparator("name",highToLow)); //优先级-中
sortFields.add(new BeanComparator("age",mycmp1)); //优先级-低
ComparatorChain multiSort = new ComparatorChain(sortFields);
Collections.sort(ul,multiSort);
for (int i =0;i<ul.size();i++) {
System.out.println(ul.get(i)); //输出
}
}
2.字符串自定义排序测试
/**
* 描述:字符串自定义排序测试
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void arraySortTest(){
List<String> strArray = new ArrayList<String>();
//1-华北地区,2-华东地区,3-华南地区,4-华中地区,5-西南地区,6-西北地区,7-东北地区
strArray.add("西北地区");//6-西北地区
strArray.add("东北地区");//7-东北地区
strArray.add("华南地区");//3-华南地区
strArray.add("西南地区");//5-西南地区
strArray.add("华北地区");//1-华北地区
strArray.add("华中地区");//4-华中地区
strArray.add("华东地区");//2-华东地区
Object[] array = strArray.toArray();
System.out.print("排序前");
System.out.println("-------------------------------------");
for(int i = 0; i < array.length; i++){
System.out.println(array);
}
System.out.print("排序后");
System.out.println("-------------------------------------");
Comparator customRegionSort = customRegionSort();
Arrays.sort(array, customRegionSort);
for (int i = 0; i < strArray.size(); i++)
System.out.println(array);
}
第三步,写main方法测试
public static void main(String[] args) {
objAttrSortTest();//对象属性自定义排序测试
arraySortTest();//字符串自定义排序测试
}
|