我有一个java bean列表,现在我想用指定的属性和排序顺序对它们进行排序 (属性和排序顺序是输入参数),如下所示:
class Person{
private String userName;
private Integer age;
private String address;
public void sort(List<Person> ps, String property, String sortOrder)
{
// How to use the property and sortOrder??
Collections.sort(ps);
}
}
编写sortList()
方法的最佳方法是什么?
实际上我有一种方法可以做到这一点。我可以为Person编写两个静态属性。然后我在排序前设置这两个属性:
class Person implements Comparable<Person>{
private String userName;
private Integer age;
private String address;
public static String sortProperty;
public static String sortOrder;
public void sort(List<Person> ps, String property, String sortOrder)
{
Person.sortProperty=property;
Person.sortOrder=sortOrder;
Collections.sort(ps);
}
@Override
public int compareTo(Person o)
{
// find the property with Person.sortProperty using reflection
// then sort the property
}
}
这不是一个好的解决方案。有人能给我一些建议吗?提前谢谢
答案 0 :(得分:4)
希望这对你有意义。使用final
关键字可避免为传递排序顺序创建static
变量。还将其更改为布尔值以便于访问。下面的代码仅供参考。
public static void sort(List<Person> ps, String property, final boolean asc) {
if (property.equals("userName")) {
Collections.sort(ps, new Comparator<Person>() {
public int compare(Person o1, Person o2) {
// pls use appropriate compareTo I always get confused
// which one to call when it is asc or desc.
if (asc)
return o1.getUserName().compareTo(o2.getUserName());
else
return o2.getUserName().compareTo(o1.getUserName());
}
});
}
if (property.equals("age")) {
Collections.sort(ps, new Comparator<Person>() {
public int compare(Person o1, Person o2) {
if (asc)
return o1.getAge().compareTo(o2.getAge());
else
return o2.getAge().compareTo(o1.getAge());
}
});
}
}
答案 1 :(得分:1)
您可以实现Comparator
并像这样使用它。
Collections.sort(ps, myComparator)
在比较器内部,您可以从person检索属性和sortOrder并与这些变量进行比较
答案 2 :(得分:1)
Collections.sort(ps, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
int result = 0;
if(sortProperty.equals("userName")) {
result = p1.userName.compareTo(p2.userName);
} else if(//...
//determine how based on sortOrder here
//e.g.
if(sortOrder.equals("ascending") {
return result;
} else {
return (result * (-1));
}
}
});
注意:property
和sortOrder
需要声明为final
。
答案 3 :(得分:1)
您应该能够Bean Comparator使用此功能。
答案 4 :(得分:0)
写三个比较器。它们可能是静态字段。 E.g。
public static final Comparator COMPARE_BY_NAME =(您的代码在这里) 类似于COMPARE_BY_AGE等。
将它们传递给标准的Java sort()方法。
答案 5 :(得分:0)
要将排序作为列表的通用扩展方法,您可以使用以下代码:
public static List<T> SortList<T>(this List<T> list, string sortDirection, string sortExpression)
{
if (sortDirection.ToLower() == "sorting_asc")
{
return (from n in list
orderby GetDynamicSortProperty(n, sortExpression) ascending
select n
).ToList();
}
else if (sortDirection.ToLower() == "sorting_desc")
{
return (from n in list
orderby GetDynamicSortProperty(n, sortExpression) descending
select n
).ToList();
}
else
{
return list;
}
}
public static object GetDynamicSortProperty(object item, string propName)
{
//Use reflection to get order type
return item.GetType().GetProperty(propName).GetValue(item, null);
}
通话:
List<Employee> employees = new List<Employee>();
var sortedEmployees = employees.SortList(sortedorder, sortedcolumn);