今天早上luckzj给我提了一个问题,即如何实现按不同的属性进行对象排序,我用JAVA集合类和比较器,实现如下: import java.util.Comparator; import java.util.TreeSet; public class SortObjt { String name; String address; Integer age; static Comparator nameComparator = new Comparator(){ public int compare(Object left, Object right){ return ((SortObjt)left).name.compareTo(((SortObjt)right).name); } }; static Comparator addComparator = new Comparator(){ public int compare(Object left, Object right){ return ((SortObjt)left).address.compareTo(((SortObjt)right).address); } }; static Comparator ageComparator = new Comparator(){ public int compare(Object left, Object right){ return ((SortObjt)left).age.compareTo(((SortObjt)right).age); } }; public SortObjt(String name, String address, int age) { // TODO Auto-generated constructor stub this.name = name; this.address = address; this.age = age; } /** * @测试代码(以按年龄排序为例) */ public static void main(String[] args) { // TODO Auto-generated method stub TreeSet group = new TreeSet(SortObjt.ageComparator); SortObjt a = new SortObjt("Bob","Shandong",15); SortObjt b = new SortObjt("Zim","Beijing",16); SortObjt c = new SortObjt("Mao","Jiangxi",13); group.add(a); group.add(b); group.add(c); for (Object i:group){ System.out.println(((SortObjt)i).name + "-" + ((SortObjt)i).address + "-" + ((SortObjt)i).age); } } } 后来跟luckzj交流了一下,他提示用JAVA的反射机制,我修改了一下,感觉更漂亮一点,代码如下: import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Comparator; import java.util.TreeSet; public class SortObjt { public String name; public String address; public Integer age; static String proper;//指示按哪个属性排序 static public void setProper(String prop){ proper = prop; } static Comparator myComparator = new Comparator(){ public int compare(Object left, Object right){ try { Field F = SortObjt.class.getDeclaredField(proper); Class T = F.getType(); try { Object a = F.get(left); Object b = F.get(right); try { Method method = T.getDeclaredMethod("compareTo",T); try { return (Integer)method.invoke(a, new Object[]{b}); } catch (InvocationTargetException 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 (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } }; public SortObjt(String name, String address, int age) { // TODO Auto-generated constructor stub this.name = name; this.address = address; this.age = age; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SortObjt.setProper("age"); TreeSet group = new TreeSet(SortObjt.myComparator); SortObjt a = new SortObjt("Bob","Shandong",15); SortObjt b = new SortObjt("Zim","Beijing",16); SortObjt c = new SortObjt("Mao","Jiangxi",13); group.add(a); group.add(b); group.add(c); for (Object i:group){ System.out.println(((SortObjt)i).name + "-" + ((SortObjt)i).address + "-" + ((SortObjt)i).age); } } }