13,100
社区成员
发帖
与我相关
我的任务
分享
package com.jccw.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortList<E> {
@SuppressWarnings("unchecked")
public void sortList(List<E> list,final String method,final String sort){
final String name="get"+method.substring(0,1).toUpperCase()+method.substring(1);
Collections.sort(list,new Comparator(){
public int compare(Object a,Object b){
int i=0;
try {
Method m1=((E)a).getClass().getMethod(name, null);
Method m2=((E)b).getClass().getMethod(name,null);
Object o1=m1.invoke(((E)a), null);
Object o2=m2.invoke(((E)b), null);
String typeName=o1.getClass().getSimpleName();
if(typeName.equals("Integer")||typeName.equals("Long")||typeName.equals("Double")||typeName.equals("Short")||typeName.equals("Float")){
i=compareTo(typeName,o1,o2);
if(sort!=null && "desc".equals(sort)){
i=i==0?i:-i;
}else{
i=i==0?i:i;
}
}else{
if(sort!=null && "desc".equals(sort)){
i=o2.toString().compareTo(o1.toString());
}else{
i=o1.toString().compareTo(o2.toString());
}
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException 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();
}
return i;
}
});
}
public int compareTo(String typeName,Object a,Object b){
if(typeName.equals("Integer")){
int i1=(Integer)a;
int i2=(Integer)b;
if(i1==i2)return 0;
else return i1-i2>0?1:-1;
}else if(typeName.equals("Long")){
long i1=(Long)a;
long i2=(Long)b;
if(i1==i2)return 0;
else return i1-i2>0?1:-1;
}else if(typeName.equals("Double")){
double i1=(Double)a;
double i2=(Double)b;
if(i1==i2)return 0;
else return i1-i2>0?1:-1;
}else if(typeName.equals("Short")){
short i1=(Short)a;
short i2=(Short)b;
if(i1==i2)return 0;
else return i1-i2>0?1:-1;
}else if(typeName.equals("Float")){
float i1=(Float)a;
float i2=(Float)b;
if(i1==i2)return 0;
else return i1-i2>0?1:-1;
}else{
return 0;
}
}
public static void main(String[] args) {
Student stu1=new Student(1,"aaa1",99F,99L,99,99D,(short)99,"000");
Student stu2=new Student(2,"aaa2",49F,49L,49,49D,(short)49,"000");
Student stu3=new Student(3,"aaa3",33F,33L,33,33D,(short)33,"000");
Student stu4=new Student(4,"aaa4",51F,51L,51,51D,(short)51,"000");
Student stu5=new Student(5,"aaa5",43F,43L,43,43D,(short)43,"000");
Student stu6=new Student(6,"aaa6",65F,65L,65,65D,(short)65,"000");
List<Student> list=new ArrayList<Student>();
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
list.add(stu5);
list.add(stu6);
System.out.println(System.currentTimeMillis());
SortList<Student> sort=new SortList<Student>();
sort.sortList(list, "name", "asc");
System.out.println(System.currentTimeMillis());
for (Student s : list) {
System.out.println(s.getId()+" "+s.getName() +" "+s.getSdouble()+" "+s.getSfloat()+" "+s.getSint()+" "+s.getSlong()+" "+s.getSshort());
}
}
}
class Student{
private int id;
private String name;
private float sfloat;
private long slong;
private int sint;
private short sshort;
private double sdouble;
private String sex;
public Student() {
// TODO Auto-generated constructor stub
}
public Student(int id, String name, float sfloat, long slong, int sint,double sdouble,short sshort, String sex) {
this.id = id;
this.name = name;
this.sfloat = sfloat;
this.slong = slong;
this.sint = sint;
this.sdouble = sdouble;
this.sshort=sshort;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getSfloat() {
return sfloat;
}
public void setSfloat(float sfloat) {
this.sfloat = sfloat;
}
public long getSlong() {
return slong;
}
public void setSlong(long slong) {
this.slong = slong;
}
public int getSint() {
return sint;
}
public void setSint(int sint) {
this.sint = sint;
}
public short getSshort() {
return sshort;
}
public void setSshort(short sshort) {
this.sshort = sshort;
}
public double getSdouble() {
return sdouble;
}
public void setSdouble(double sdouble) {
this.sdouble = sdouble;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
public int compareTo(Class<?> c,Object a,Object b){
if(c == Integer.class){
return ((Integer)a).compareTo((Integer)b);
}else if(c == Long.class){
return ((Long)a).compareTo((Long)b);
}else if(c == Double.class){
return ((Double)a).compareTo((Double)b);
}else if(c == Short.class){
return ((Short)a).compareTo((Short)b);
}else if(c == Float.class){
return ((Float)a).compareTo((Float)b);
}else{
return (a.toString().compareTo(b.toString()));
}
}
//调用
Object o1=m1.invoke(((E)a), null);
Object o2=m2.invoke(((E)b), null);
int i compareTo(o1.getClass(),o1,o2);
if ("desc".equals(sort)) {
i *= -1;
}
public int compareTo(Object a, Object b) {
int k = (a == null && b==null) ? 0 : ((a==null) ? -1 : ((b==null) ? 1: 2));
// switch (k) {
if (k == 2) {
// case -1://都是null
// return 0;
// case 0://都不是null
// if (a.getClass() == b.getClass() //&& a instanceof Number && a instanceof Comparable
// ) {
@SuppressWarnings("unchecked")
if (a instanceof Comparable) { //因为List存的是相同类型的对象,
//所以相同的get方法取出来的应该是也是相同的Class,
//只需判断是否是Comparable接口,但是这样要在编译时的unchecked
k = ((Comparable) a).compareTo(b);
} else {
//throw new IllegalArgumentException();
k = a.toString().compareTo(b.toString()); //Lz的意思好像是除了想要比较的几种类型,其他的都是转为String去比较
}
// default://其中一个为null的始终最小
// return k;
}
return k;
}
public class SortList<E> {
@SuppressWarnings("unchecked")
public void sortList(List<E> list,final String method,final String sort){
final String name="get"+method.substring(0,1).toUpperCase()+method.substring(1);
Collections.sort(list,new Comparator(){
public int compare(Object a,Object b){
int i=0;
try {
Method m1=((E)a).getClass().getMethod(name, null);
Method m2=((E)b).getClass().getMethod(name,null);
Object o1=m1.invoke(((E)a), null);
Object o2=m2.invoke(((E)b), null);
//String typeName=o1.getClass().getSimpleName();
//if(typeName.equals("Integer")||typeName.equals("Long")||typeName.equals("Double")||typeName.equals("Short")||typeName.equals("Float")){
//i=compareTo(typeName,o1,o2);
//if(sort!=null && "desc".equals(sort)){
// i=i==0?i:-i;
//}else{
// i=i==0?i:i;
//}
//}else{
//if(sort!=null && "desc".equals(sort)){
// i=o2.toString().compareTo(o1.toString());
//}else{
// i=o1.toString().compareTo(o2.toString());
//}
//}
Object o1=m1.invoke(((E)a), null);
Object o2=m2.invoke(((E)b), null);
int i compareTo(o1.getClass(),o1,o2);
if ("desc".equals(sort)) {
i *= -1;
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException 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();
}
return i;
}
});
}
//public int compareTo(String typeName,Object a,Object b){
public int compareTo(Class<?> c,Object a,Object b){
if(c == Integer.class){
return ((Integer)a).compareTo((Integer)b);
}else if(c == Long.class){
return ((Long)a).compareTo((Long)b);
}else if(c == Double.class){
return ((Double)a).compareTo((Double)b);
}else if(c == Short.class){
return ((Short)a).compareTo((Short)b);
}else if(c == Float.class){
return ((Float)a).compareTo((Float)b);
}else{
return (a.toString().compareTo(b.toString()));
}
}
public int compareTo(Object a, Object b) {
int k = (a == null ? 0 : 2) + (b == null ? -1 : -2);
switch (k) {
case -1://都是null
return 0;
case 0://都不是null
if (a.getClass() == b.getClass() //&& a instanceof Number && a instanceof Comparable
) {
return ((Comparable) a).compareTo(b);
} else {
throw new IllegalArgumentException();
}
default://其中一个为null的始终最小
return k;
}