我可以使用以下方法,以便我可以传递任何对象的列表,它会按照我想要的顺序返回一个排序列表吗?
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类。我想要一个适用于任何对象列表的方法,我可以指定我想要的顺序以及要排序的对象的属性。
答案 0 :(得分:3)
答案 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对象