2011-12-09 161 views
-1

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

這不是一個好的解決方案。任何人都可以給我一些建議嗎?在此先感謝

回答

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()); 
     } 
    }); 
    } 
} 
+0

避免使用反射的好替代方案。 +1。 –

1

您可以實現Comparator並像這樣使用它。 Collections.sort(ps, myComparator)

裏面的比較,你可以剛從人檢索屬性和中將sortOrder並與這些變量

+0

我在哪裏可以取回財產,中將sortOrder?應該有地方設置這兩個變量,在哪裏? – Wint

+0

比較器是一個接口,你需要實現比較方法,它將包含Person作爲參數,你可以檢查gurung的答案,他給你寫了一個例子:) –

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

0

寫三個比較器。他們可能是靜態的領域。例如。

公共靜態最終比較COMPARE_BY_NAME =(你的代碼在這裏) 而對於COMPARE_BY_AGE等類似

它們傳遞給標準的Java排序()方法。

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); 
相關問題