2011-12-09 11 views
-1

私はjava beansのリストを持っていますが、今度は指定されたプロパティとソート順でソートしたいと考えています (プロパティとソート順は入力パラメータです)指定されたプロパティとソート順のリストをソートする方法

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に対して2つの静的プロパティを書くことができます。並べ替えの前にこれらの2つのプロパティを設定します。

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

希望はあなたにとって理にかなっています。ソート順を渡す変数staticの作成を避けるには、finalキーワードを使用します。ブール値に変更して簡単にアクセスできます。以下のコードは説明のためのものです。

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を実装して、このように使用できます。 final宣言するpropertysortOrder必要性:あなただけの人から財産とはsortOrderを取得し、これらの変数

+0

?これらの2つの変数を設定する場所があるはずです。 – Wint

+0

Comparatorはインターフェイスで、Personを引数として含むcompareメソッドを実装する必要があります。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)); 
     } 
    } 
}); 

注意して比較することができ、比較器内部 Collections.sort(ps, myComparator)

0

3つのコンパレータを作成します。それらは静的フィールドである可能性があります。例えば。

のpublic static finalコンパレータ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); 
    } 

呼び出し:私はプロパティとはsortOrderを取得することができます

 List<Employee> employees = new List<Employee>(); 
     var sortedEmployees = employees.SortList(sortedorder, sortedcolumn); 
関連する問題