定义排序注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Order {
public int value();
排序核心
static class OrderHelper {
public static <T> void sort(List<T> list,CustomerOrder customerOrder) {
if (list.isEmpty()) {
return;
}
Field[] fields = list.get(0).getClass().getDeclaredFields();
if (fields == null || fields.length == 0) {
return;
}
final TreeMap<Integer, Field> map = new TreeMap<Integer, Field>();
Order order = null;
for (Field field : fields) {
order = field.getDeclaredAnnotation(Order.class);
if (order != null) {
map.put(order.value(), field);
}
}
if (map.size() > 0) {
list.sort(new Comparator<T>() {
public int compare(T o1, T o2) {
return OrderHelper.sort(o1, o2, map,customerOrder);
}
});
}
}
private static <T> int sort(T o1, T o2, TreeMap<Integer, Field> map,CustomerOrder customerOrder) {
try {
if (map == null || map.size() == 0) {
return 0;
}
Collection<Field> values = map.values();
Object value1 = null;
Object value2 = null;
for (Field field : values) {
field.setAccessible(true);
value1 = field.get(o1);
value2 = field.get(o2);
if (value1 == null) {
return 1;
}
if (value2 == null) {
return -1;
}
if(customerOrder != null){
Object[] customerOrderResult = customerOrder.getOrder(field, value1, value2);
if(customerOrderResult != null && customerOrderResult.length ==2){
value1 = customerOrderResult[0];
value2 = customerOrderResult[1];
}
}
if (value1 instanceof Integer) {
int result = Integer.compare(Integer.parseInt(value1.toString()), Integer.parseInt(value2.toString()));
if (result != 0) {
return result;
}
} else if (value1 instanceof Long) {
int result = Long.compare(Long.parseLong(value1.toString()), Long.parseLong(value2.toString()));
if (result != 0) {
return result;
}
} else if (value1 instanceof Double) {
int result = Double.compare(Double.parseDouble(value1.toString()), Double.parseDouble(value2.toString()));
if (result != 0) {
return result;
}
} else if (value1 instanceof Float) {
int result = Float.compare(Float.parseFloat(value1.toString()), Float.parseFloat(value2.toString()));
if (result != 0) {
return result;
}
} else if (value1 instanceof Short) {
int result = Short.compare(Short.parseShort(value1.toString()), Short.parseShort(value2.toString()));
if (result != 0) {
return result;
}
} else if (value1 instanceof Byte) {
int result = Byte.compare(Byte.parseByte(value1.toString()), Byte.parseByte(value2.toString()));
if (result != 0) {
return result;
}
} else if (value1 instanceof Date) {
Date d1 = (Date)value1;
Date d2 = (Date)value2;
long result = d1.getTime() - d2.getTime();
if (result > 0) {
return 1;
}
if (result < 0) {
return -1;
}
} else {
if (value1.hashCode() - value2.hashCode() != 0) {
return value1.hashCode() - value2.hashCode();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}
客户自定义排序规则
static interface CustomerOrder{
public Object[] getOrder(Field field,Object v1,Object v2);
}
使用示例
public static void main(String[] args) {
List<GxdwOfZrmjOutputDTO> list = new ArrayList<GxdwOfZrmjOutputDTO>();
GxdwOfZrmjOutputDTO b1 = new GxdwOfZrmjOutputDTO();
b1.setHylb("A");
b1.setGajgmc("a");
GxdwOfZrmjOutputDTO b2 = new GxdwOfZrmjOutputDTO();
b2.setHylb("A");
b2.setGajgmc("a");
GxdwOfZrmjOutputDTO b3 = new GxdwOfZrmjOutputDTO();
b3.setHylb("B");
b3.setGajgmc("a");
GxdwOfZrmjOutputDTO b4 = new GxdwOfZrmjOutputDTO();
b4.setHylb("C");
b4.setGajgmc("a");
CustomerOrder order = new CustomerOrder() {
@Override
public Object[] getOrder(Field field, Object v1, Object v2) {
Integer r1 = v1.equals("C") ? 1 : 2;
Integer r2 = v2.equals("C") ? 1 : 2;
return new Object[]{r1,r2};
}
};
list.add(b1);
list.add(b2);
list.add(b3);
list.add(b4);
OrderHelper.sort(list,order);
System.out.println(123);
}