工具类
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()); } } }