Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中通用列表的筛选和排序项_Java_Collections_Guava - Fatal编程技术网

Java中通用列表的筛选和排序项

Java中通用列表的筛选和排序项,java,collections,guava,Java,Collections,Guava,我正在为web应用程序实现搜索、排序和分页逻辑,我需要找到一种高效且可能不冗长的方法来对泛型类型列表(list)的项进行排序和筛选。我希望动态地传递列表排序所依据的字段(例如,作为字符串) 使用Guava库是一个好主意还是使用标准java库可以达到同样的效果?我从未使用过Guava,如果我只将它们用于次要的实用程序,我会避免在我的项目中添加额外的库 注意,我的项目中也使用了Spring。是否有一些有用的实用程序来处理集合 在.NET应用程序中,我通常使用LINQ来操作和查询集合,我希望找到类似的

我正在为web应用程序实现搜索、排序和分页逻辑,我需要找到一种高效且可能不冗长的方法来对泛型类型列表(
list
)的项进行排序和筛选。我希望动态地传递列表排序所依据的字段(例如,作为字符串)

使用Guava库是一个好主意还是使用标准java库可以达到同样的效果?我从未使用过Guava,如果我只将它们用于次要的实用程序,我会避免在我的项目中添加额外的库

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

在.NET应用程序中,我通常使用LINQ来操作和查询集合,我希望找到类似的方法,或者至少是这种方法的简单替代方法。。。你能帮我吗

注意
我需要按任意字段对自定义对象进行排序,因此如果我有一个
Person
对象,其中包含
name
姓氏
年龄
字段,我需要按其中一个字段对列表进行排序。

标准Java库提供
集合。sort()
用于一次性排序,而
TreeSet
TreeMap
用于永久排序的集合


集合中的对象需要实现Compariable(在这种情况下,上述所有操作的默认行为都是使用自然排序),或者您可以为排序操作指定一个
比较器(或
树*
)。如果您确实指定了一个
比较器,它将超越默认的排序行为并完全替换它。

Arrays.sort将很好地处理排序

在过滤的情况下,只要使用比较器,hashcode/equals就可以使用TreeSet等


番石榴也做同样的事情,不管怎样,拥有番石榴也是一件好事,因为这个库包含的不仅仅是收藏。

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

直接来自Java文档。

当使用比较器时,应谨慎使用,比较器能够对排序集(或排序映射)施加与等于不一致的排序。假设一个带有显式比较器c的排序集(或排序映射)与从集合S中提取的元素(或键)一起使用。如果c对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());
    }
假设人员是人员列表

除了这里的(很棒的)答案之外,使用Java8,您可以通过以下方式使用比较器:
myPersons.sort(comparator.comparating(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;
    }
}
公共类Java8Comparator{
公共静态void main(字符串[]args){
List myPersons=getPersons();
System.out.println(“排序前…”);
myPerson.forEach(myPerson->
System.out.println(“Person:+myPerson.getFirstName()+”,工资:+myPerson.getSalary()+,年龄:+myPerson.getAge());
排序(Comparator.comparing(MyPerson::getAge));
排序(Comparator.comparing(MyPerson::getFirstName));
排序(Comparator.comparing(MyPerson::getSalary));
System.out.println(“排序后…”);
myPerson.forEach(myPerson->
System.out.println(“Person:+myPerson.getFirstName()+”,工资:+myPerson.getSalary()+,年龄:+myPerson.getAge());
}
私有静态列表getPersons(){
列表结果=新建ArrayList();
结果。添加(新MyPerson(“saul”),新BigDecimal(“86000”),54);
结果。添加(新MyPerson(“mahmud”),新BigDecimal(“67000”),21);
结果。添加(新MyPerson(“hillary”),新BigDecimal(“120000”),46);
结果。添加(新MyPerson(“mickel”),新BigDecimal(“180000”),25);
结果。添加(新MyPerson(“donald”),新BigDecimal(“140000”),17);
返回结果;
}
}
类MyPerson{
私有字符串名;
私人薪酬;
私人互联网;
公共MyPerson(字符串firstName,bigdecime salary,int age){
this.firstName=firstName;
这个。薪水=薪水;
这个。年龄=年龄;
}
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共工资(){
返回工资;
}
公共无效设置薪资(大十进制薪资){
这个。薪水=薪水;
}
公共整数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;
    }
}