如何使用指定的属性和排序顺序对列表进行排序

时间:2011-12-09 03:59:30

标签: java list sorting

我有一个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
    }
}

这不是一个好的解决方案。有人能给我一些建议吗?提前谢谢

6 个答案:

答案 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));
        }
    }
});

注意:propertysortOrder需要声明为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);