2014-01-13 1 views
0

Я реализую логику поиска, сортировки и разбиения на страницы для веб-приложения, и мне нужно найти эффективный и, возможно, нелогичный способ сортировки и фильтрации элементов общего типа (например, List<T>). Я хотел бы динамически передать поле, по которому будет сортироваться список (например, строка).Фильтровать и сортировать элементы общего списка в Java

Полезно ли использовать библиотеки Guava или я могу достичь того же результата с помощью стандартных java-библиотек? Я никогда не использовал Guava, и я бы избегал добавлять дополнительные библиотеки в свой проект, если я буду использовать их только для небольших утилит.

Примечание. Я также использую Spring в своем проекте. Есть ли полезная утилита для обработки коллекций?

В .NET-приложениях я обычно использую LINQ для создания и запроса коллекций, я бы хотел найти что-то подобное или, по крайней мере, простую альтернативу этому подходу ... вы можете мне помочь?

Примечание мне нужно сортировки пользовательских объектов произвольного поля, поэтому, если у меня есть Person объекта с name, surname и age полеем, мне нужно, чтобы отсортировать список по одному из них.

+0

Ну если я не ошибаюсь, Guava - это open-source, поэтому вы можете посмотреть под капотом и проверить, как они реализуют свои ... – gtgaxiola

ответ

1

Стандартные библиотеки Java предоставляют Collections.sort() для однократной сортировки и TreeSet и TreeMap для постоянно отсортированных коллекций.

Либо объекты внутри коллекций должны реализовывать сопоставимые (в этом случае поведение по умолчанию для всего вышеперечисленного должно сортироваться с использованием естественного упорядочения), либо вы можете указать Comparator операции сортировки (или Tree*). Если вы укажете Comparator, он переместит поведение сортировки по умолчанию и полностью заменит его.

0

Arrays.sort отлично справится с сортировкой.

В случае фильтрации до тех пор, как компаратор, хэш-код/​​равно будет делать только штрафом с TreeSet и т.д.

гуавы делает то же самое, так или иначе имеющие гуавы хорошо также, так как эта библиотека содержит путь более просто коллекции.

1

Вы можете написать собственный заказ Comparator для сортировки. Когда вы пишете свой компаратор, вы можете использовать метод Collections.sort() для сортировки его способом, определенным в методе compare(). Метод compare() должен соответствовать методу equals(). Как и в случае, если два объекта равны, то они должны сравниваться как равные.

Прямо из документов Java.

Предостережение должно выполняться при использовании компаратора, способного накладывать заказ, несовместимый с равным порядку сортированного набора (или отсортированной карты). Предположим, что отсортированный набор (или отсортированная карта) с явным компаратором c используется с элементами (или ключами), взятыми из набора S. Если порядок, наложенный c на S, несовместим с равными, отсортированный набор (или отсортированная карта) будет ведут себя «странно». В частности, сортированный набор (или отсортированная карта) нарушит общий контракт для множества (или карты), который определяется в терминах равных.

Один, способ сделать это на основе 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()); 
    } 

Теперь, когда вы упорядочивать коллекцию List с помощью 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; 
    } 
} 
Смежные вопросы