2014-01-13 101 views
0

我正在實現Web應用程序的搜索,排序和分頁邏輯,我需要找到一種有效且可能不是詳細的方式來排序和篩選通用類型列表的項目List<T>)。我想動態傳遞列表將被排序的字段(例如,作爲一個字符串)。在Java中篩選和排序通用列表的項目

使用Guava庫或使用標準java庫可以達到相同結果是一個好主意嗎?我從來沒有使用Guava,如果我只將它們用於小型實用程序,我會避免將其他庫添加到我的項目中。

注意我也在我的項目中使用Spring。是否有一些有用的工具來處理集合?

在.NET應用程序中,我通常使用LINQ來處理和查詢集合,我希望能找到類似的東西或者至少是這種方法的一個簡單的替代方法...你能幫我嗎?

注意 我需要排序自定義對象的任意字段,所以如果我有namesurnameage字段Person對象,我需要通過這些一個對列表進行排序。

+0

好如果我沒有弄錯Guava是開源的,那麼你可以看看引擎蓋下的內容,並檢查它們是如何實現它們的...... – gtgaxiola

回答

1

標準Java庫提供Collections.sort()用於一次性排序,TreeSetTreeMap用於永久排序的集合。

無論是集合內的對象需要實現可比的(在這種情況下,所有上述的默認行爲是使用自然順序排序),或者你可以指定一個Comparator的排序操作(或Tree*)。如果您確實指定了Comparator,它將覆蓋默認的排序行爲並完全替換它。

0

Arrays.sort將處理排序就好了。

在過濾的情況下,只要比較,哈希代碼/等於會做只是一個TreeSet罰款等

番石榴做同樣的事情,好歹有番石榴也不錯,因爲這個庫包含方式更多的則只是集合。

1

您可以編寫自己的自定義Comparator進行排序。當您編寫比較器時,您可以使用Collections.sort()方法按照compare()方法中定義的方式對其進行排序。 compare()方法應該與equals()方法相似。如果兩個對象是相等的,那麼他們應該比較相等。

直接來自Java文檔。

當使用能夠強制排序與equals不一致的比較器來排序排序集合(或排序映射)時應謹慎。假設使用顯式比較器c的排序集合(或排序映射)與從集合S中繪製的元素(或鍵)一起使用。如果由S對c施加的排序與equals不一致,則排序集合(或排序映射)將表現「奇怪」。特別是,排序後的集合(或排序後的映射)將違反集合(或映射)的一般合約,集合(或映射)以等式定義。

一個,這樣做基於3個不同參數的方式也,寫3個不同的比較,

public class FirstNameComparator implements Comparator<Person>{ 

    public int compare(Person person1, Person person2) { 
     return person1.getFirstName().compareTo(person2.getFirstName()); 
    } 

public class LastNameComparator implements Comparator<Person>{ 

    public int compare(Person person1, Person person2) { 
     return person1.getLastName().compareTo(person2.getLastName()); 
    } 

現在,當你整理你的使用Collections.sort()方法簽名列表的收集哪些採用用戶定義的比較器對列表進行排序。

這將是

Collections.sort(persons, new LastNameComparator()); 

假設人是人的名單。

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html

0

小除了這裏的(大)的答案,與Java8可以用比較的方式如下:myPersons.sort(Comparator.comparing(MyPerson::getAge));

的完整代碼,我寫例如:

public class Java8Comparator { 

    public static void main(String[] args) { 

     List<MyPerson> myPersons = getPersons(); 

     System.out.println("Before Sort..."); 
     myPersons.forEach(myPerson -> 
       System.out.println("Person: " + myPerson.getFirstName() + " with salary: " + myPerson.getSalary() + " and age: " + myPerson.getAge())); 

     myPersons.sort(Comparator.comparing(MyPerson::getAge)); 
     myPersons.sort(Comparator.comparing(MyPerson::getFirstName)); 
     myPersons.sort(Comparator.comparing(MyPerson::getSalary)); 

     System.out.println("After Sort..."); 
     myPersons.forEach(myPerson -> 
       System.out.println("Person: " + myPerson.getFirstName() + " with salary: " + myPerson.getSalary() + " and age: " + myPerson.getAge())); 
    } 

    private static List<MyPerson> getPersons() { 
     List<MyPerson> result = new ArrayList<>(); 

     result.add(new MyPerson("saul", new BigDecimal("86000"), 54)); 
     result.add(new MyPerson("mahmud", new BigDecimal("67000"), 21)); 
     result.add(new MyPerson("hillary", new BigDecimal("120000"), 46)); 
     result.add(new MyPerson("mickel", new BigDecimal("180000"), 25)); 
     result.add(new MyPerson("donald", new BigDecimal("140000"), 17)); 

     return result; 
    } 
} 

class MyPerson { 

    private String firstName; 
    private BigDecimal salary; 
    private int age; 

    public MyPerson(String firstName, BigDecimal salary, int age) { 
     this.firstName = firstName; 
     this.salary = salary; 
     this.age = age; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public BigDecimal getSalary() { 
     return salary; 
    } 

    public void setSalary(BigDecimal salary) { 
     this.salary = salary; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 
}