对对象列表进行排序

时间:2013-06-06 16:42:44

标签: java list sorting object comparison

我可以使用以下方法,以便我可以传递任何对象的列表,它会按照我想要的顺序返回一个排序列表吗?

public List sort(List listToBeSorted,String order,String property){ }

class Person{
    private String name;
    private Date dob;
    private int age; 
}

所以如果我这样调用上面的方法:

sort(myList, "ascending", "name");

它将按人物对象的“名称”属性的升序对列表进行排序。


我尝试使用Comparator如下,但无法接近我真正想要的任何地方。

   public class PersonComparator {
    public static final Comparator<Person> NAME_COMPARATOR = new Comparator<Person>() {
        @Override
        public int compare(Person object1, Person object2) {            
            return object1.getName().compareToIgnoreCase(object2.getName());
        }       
    };  
    public static final Comparator<Person> DOB_COMPARATOR = new Comparator<Person>() {
        @Override
        public int compare(Person object1, Person object2) {
            return object1.getDob().compareTo(object2.getDob());
        }       
    };  
    public static final Comparator<Person> AGE_COMPARATOR = new Comparator<Person>() {
        @Override
        public int compare(Person object1, Person object2) {
            return object1.getAge().compareTo(object2.getAge());
        }       
    };  
}

使用比较器如下:

List<Person> myList = new ArrayList<Person>();
Collections.sort(myList, PersonComparator.NAME_COMPARATOR);

编辑:

我给出的例子很好。但它只适用于Person类。我想要一个适用于任何对象列表的方法,我可以指定我想要的顺序以及要排序的对象的属性。

3 个答案:

答案 0 :(得分:3)

查看Bean Comparator

  

它将按人物对象的“名称”属性的升序对列表进行排序。

您可以控制排序顺序,但指定了访问属性的方法,而不是属性本身。

答案 1 :(得分:2)

对于升序和降序,您可以使用reverseOrder获取不同的Comparator。它直接由Java支持,是实现逆转排序效果的一种相当标准的方法。

如果要根据参数使用不同的字段,则可能需要反射才能执行此操作。请注意,在比较字段之前,您可能需要检查字段isAssaignableFrom Comparable。否则,您可以选择抛出IllegalArgumentException或其他东西。

答案 2 :(得分:1)

你可以这样实现......

class MyCompartor<E>{
    public Comparator<E> getCompartor(final String order,final String propertyName){

        return new Comparator<E>() {

                @Override
                public int compare(E o1, E o2) {
                        Class noparams[]={};
                        try {
                            char temp[] = propertyName.toCharArray();
                            temp[0] = Character.toUpperCase(temp[0]);
                            String tempName=new String(temp);
                            Method method = o1.getClass().getDeclaredMethod("get"+tempName, noparams);
                            Object val1 = method.invoke(o1, null);
                            Object val2 = method.invoke(o2, null);
                            if(order.equalsIgnoreCase("ascending"))
                            {
                                return ((Comparable)val1).compareTo(val2);
                            }else{
                                return ((Comparable)val2).compareTo(val1);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        } 
                    return 0;
                }
            };
    }
}

并调用这样的排序

Collections.sort(list,new MyCompartor<Person>().getCompartor("ascending", "name"));

希望这有帮助吗? 但请注意,属性必须返回一个java.lang.Comparable对象

相关问题