使用Java过滤和排序通用列表中的项目

时间:2014-01-13 14:31:14

标签: java collections guava

我正在为Web应用程序实现搜索,排序和分页逻辑,我需要找到一种有效且可能不详细的方法来排序和过滤泛型类型列表(List<T>)的项目。我想通过dynamally传递列表将被排序的字段(例如,作为字符串)。

使用Guava库是个好主意还是使用标准java库可以获得相同的结果?我从来没有使用过Guava,如果我将它们仅用于小型工具,我会避免在我的项目中添加额外的库。

注意我也在我的项目中使用Spring。是否有一些有用的实用程序来处理集合?

在.NET应用程序中,我通常使用LINQ来编写和查询集合,我想找到类似的东西,或者至少是这种方法的简单替代方法......你能帮助我吗?

注意 我需要通过任意字段排序自定义对象,因此如果我有Personnamesurnameage字段的对象,需要按其中一个对列表进行排序。

4 个答案:

答案 0 :(得分:1)

标准Java库为一次性排序提供Collections.sort(),为永久排序的集合提供TreeSetTreeMap

集合中的对象需要实现可比较(在这种情况下,上述所有内容的默认行为是使用自然排序进行排序),或者您可以为排序操作指定Comparator(或{{ 1}})。如果确实指定了Tree*,它会覆盖默认排序行为并完全替换它。

答案 1 :(得分:1)

您可以编写自己的自定义Comparator进行排序。当您编写比较器时,可以使用Collections.sort()方法以compare()方法中定义的方式对其进行排序。 compare()方法应该与equals()方法类似。如果。如果两个对象是等于那么它们应该比较相等。

直接来自Java Docs。

当使用能够强加与equals不一致的排序的比较器来排序有序集(或有序映射)时,应该小心。假设带有显式比较器c的有序集(或有序映射)与从集合S中绘制的元素(或键)一起使用。如果由S对S施加的排序与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()方法签名对List集合进行排序时,该签名采用用户定义的比较器对列表进行排序。

哪个是

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

假设人是人员名单。

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

答案 2 :(得分:0)

Arrays.sort将处理排序就好了。

如果像Comparator一样进行过滤,hashcode / equals可以很好地使用TreeSet等。

Guava做同样的事情,无论如何还有guava也很好,因为这个库包含的方式不仅仅是集合。

答案 3 :(得分: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;
    }
}