工具类
package sort;
import java.lang.reflect.Method;
import java.text.Collator;
import java.util.Comparator;
import java.util.Date;
/**
* @Title: LocalComparator.java
* @Package
* @Description: TODO(用一句话描述该文件做什么)
* @author licy
* @date 2018年11月8日
* @version V1.0
*/
public class LocalComparator implements Comparator{
private Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);
/**
* 排序字段
**/
private String[] sortBy;
/*
* 字段对应排序类型 (1:升序,-1:降序) 一一对应
*/
private int[] order;
public LocalComparator(String[] sortBy, int[] order) {
this.sortBy = sortBy;
this.order = order;
}
/*
* 定义排序规则 如果按照不止一个属性进行排序 这按照属性的顺序进行排序,类似sql order by 即只要比较出同位置的属性就停止
*/
public int compare(Object o1, Object o2) {
for (int i = 0; i < sortBy.length; i++) {
Object value1 = getFieldValueByName(sortBy[i], o1);
Object value2 = getFieldValueByName(sortBy[i], o2);
if (value1 instanceof Integer && value2 instanceof Integer) {
int v1 = Integer.parseInt(value1.toString());
int v2 = Integer.parseInt(value2.toString());
if (v1 > v2) {
return 1 * this.order[i];
} else if (v1 < v2) {
return -1 * this.order[i];
}
} else if (value1 instanceof Long && value2 instanceof Long) {
Long v1 = (Long) value1;
Long v2 = (Long) value2;
if (v1 > v2) {
return 1 * this.order[i];
} else if (v1 < v2) {
return -1 * this.order[i];
}
} else if (value1.getClass() == Date.class && value2.getClass() == Date.class) {
Date time1 = (Date) value1;
Date time2 = (Date) value2;
if (time1.getTime() > time2.getTime()) {
return 1 * this.order[i];
} else if (time1.getTime() < time2.getTime()) {
return -1 * this.order[i];
}
} else {
int result = cmp.compare(value1, value2);
if (result != 0) {
return result * this.order[i];
}
}
}
return 1;
}
/**
*
* 通过反射,获取属性值
*
* @param fieldName
* @param o
* @return
*/
private Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
System.out.println("属性不存在");
return null;
}
}
}
测试类
package sort.test;
/**
* @Title: Persion.java
* @Package sort.test
* @Description: TODO(用一句话描述该文件做什么)
* @author licy
* @date 2018年11月8日
* @version V1.0
*/
public class Persion {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Persion() {
super();
// TODO Auto-generated constructor stub
}
public Persion(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
执行测试类
package sort.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import sort.LocalComparator;
public class ComparatorTest {
@SuppressWarnings("unchecked")
@Test
public void test() {
List list = new ArrayList();
Persion p1 = new Persion("a", 3);
Persion p2 = new Persion("b", 2);
Persion p3 = new Persion("b", 1);
list.add(p1);
list.add(p2);
list.add(p3);
String[] sortBy = new String[] { "name", "age" };
int[] order = new int[] { 1, -1 };
LocalComparator lc = new LocalComparator(sortBy, order);
Collections.sort(list, lc);
for(int i=0;i<list.size();i++) {
Persion p = (Persion) list.get(i);
System.out.println(p.getName() + ":" + p.getAge());
}
}
}