~~~~~~~~~~~~~生命不止,折腾不休~~~~~~~~~~~~~~~废话不多说,直接上代码
第一步 排序通用类定义
package com.dbc.yangg.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CommonSort<E> {
public enum SortOrderBy{
ADS,DESC;
}
public enum SortType{
STRING,NUMBER;
}
public void sort(List<E> list,final String methodName,final SortType type){
sort(list,methodName,type,SortOrderBy.ADS);
}
/*
* list 需要排序的对象数组
* methodName 排序字段的get方法
* type 排序类型:字符串和数字两种可扩展
* orderBy 正序 反序
*/
public void sort(List<E> list,final String methodName,final SortType type,final SortOrderBy orderBy){
Collections.sort(list, new Comparator<E>() {
@Override
public int compare(E arg0, E arg1) {
// TODO Auto-generated method stub
int result=0;
try {
Method m1=((E)arg0).getClass().getMethod(methodName, null);
Method m2=((E)arg1).getClass().getMethod(methodName, null);
switch (type) {
case STRING:
try {
result= m1.invoke(((E)arg0), null).toString().compareTo(m2.invoke(((E)arg1), null).toString());
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case NUMBER:
try {
if((Double.parseDouble(m1.invoke(((E)arg0), null).toString())-Double.parseDouble(m1.invoke(((E)arg0), null).toString()))>0){
result=1;
}else{
result=-1;
}
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(orderBy==SortOrderBy.DESC){
result*=-1;
}
return result;
}
});
}
}
第二步 定义一个测试class
package com.dbc.yangg.reflect;
public class Demo {
private String username;
private Long id;
public Demo(String username, Long id) {
// TODO Auto-generated constructor stub
this.id=id;
this.username=username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
第三步 写main 函数了
package com.dbc.yangg.reflect;
import java.util.ArrayList;
import java.util.List;
import com.dbc.yangg.reflect.CommonSort.SortOrderBy;
import com.dbc.yangg.reflect.CommonSort.SortType;
public class Init {
public static void main(String[] argv) {
List<Demo> list=new ArrayList<Demo>();
list.add(new Demo("a",1L));
list.add(new Demo("d",45L));
list.add(new Demo("r",100L));
list.add(new Demo("q",70L));
list.add(new Demo("q",55L));
CommonSort<Demo> sort=new CommonSort<Demo>();
System.out.println(">>>>>>>>字符串正排序<<<<<<<<<");
System.out.println("username\tid");
sort.sort(list, "getUsername", SortType.STRING);
for(Demo demo:list){
System.out.println(demo.getUsername()+"\t"+demo.getId());
}
System.out.println(">>>>>>>>数字正排序<<<<<<<<<");
System.out.println("username\tid");
sort.sort(list, "getId", SortType.NUMBER,SortOrderBy.DESC);
for(Demo demo:list){
System.out.println(demo.getUsername()+"\t"+demo.getId());
}
}
}
第四步 观察测试结果
>>>>>>>>字符串正排序<<<<<<<<<
username id
a 1
d 45
q 70
q 55
r 100
>>>>>>>>数字正排序<<<<<<<<<
username id
r 100
q 55
q 70
d 45
a 1