1

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

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 类。我想要一种适用于任何对象列表的方法,并且我可以指定我想要的顺序以及要排序的对象的属性。

4

3 回答 3

3

查看Bean 比较器

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

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

于 2013-06-06T17:01:41.063 回答
2

对于升序和降序,您可能会使用reverseOrder来获得不同的Comparator. 这是Java直接支持的,是一种比较标准的实现倒序效果的方法。

如果您想基于参数使用不同的字段,那么您可能需要反射来执行此操作。请注意,您可能需要在比较字段之前检查该字段。否则,您可以选择扔一个或一些关闭。isAssaignableFrom ComparableIllegalArgumentException

于 2013-06-06T16:50:09.193 回答
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 对象

于 2013-06-06T17:35:40.283 回答