Java 如何通过不同的参数找到集合中元素的最小值和最大值?

Java 如何通过不同的参数找到集合中元素的最小值和最大值?,java,Java,我收集了以下资料: Name Age Salary John 30 $1000 Mary 25 $2000 Eric 22 $5000 我怎样才能找到最低年龄、工资和最高年龄、工资 由于您的帖子中没有任何信息,我将做出一些假设 您有一个Employee类,看起来像: public class Employee {

我收集了以下资料:

Name            Age           Salary
John            30            $1000
Mary            25            $2000
Eric            22            $5000

我怎样才能找到最低年龄、工资和最高年龄、工资

由于您的帖子中没有任何信息,我将做出一些假设

您有一个
Employee
类,看起来像:

public class Employee {
    private String name;
    private int age;
    private BigDecimal salary;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public BigDecimal getSalary() {
        return salary;
    }

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }
}
您有一些
集合
这样的
列表

final List<Employee> employees = ...
您将看到,这将返回一个
可选的
——这是因为
employees
为空时的行为未定义。你需要定义自己的行为

类似地,对于其他属性:

Optional<Employee> youngest = employees.stream().
        min(Comparator.comparing(Employee::getAge));

Optional<Employee> highestEarner = employees.stream().
        max(Comparator.comparing(Employee::getSalary));

Optional<Employee> lowestEarner = employees.stream().
        min(Comparator.comparing(Employee::getSalary));
Optional=employees.stream()。
min(Comparator.comparing(Employee::getAge));
可选的highestEarner=employees.stream()。
max(Comparator.comparating(Employee::getSalary));
可选lowestEarner=employees.stream()。
min(Comparator.comparing(Employee::getSalary));

假设您使用的是一组自定义对象(比如Person对象),您只需将API与其他对象一起使用即可

假设Person类至少有以下三种方法:

getName()
getAge()
getSalary()
现在,您可以实现年龄比较器:

public class AgeComparator implements Comparator<Person> {

    public int compare(Person p1, Person p2) {
        if(p1.getAge() < p2.getAge()) return -1;
        else if(p1.getAge() > p2.getAge()) return 1;
        else return 0;
    }

    public boolean equals(Person p1, Person p2) {
        return this.compare(p1, p2) == 0;
    }
}
您可以使用另一个比较器(比如SalaryComparator),该比较器与AgeComarator类似,但会考虑薪资

Collections.min(myList, new SalaryComparator());

当然,您也可以为此使用单个类,并设置一个变量,而不是使用两个不同的比较器。

您可以为每个字段设置一个比较器

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class NameAgeSalary {
    private String name;
    private Integer age;
    private Float salary;

    private NameAgeSalary(String name, Integer age, Float salary) {
        super();
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "NameAgeSalary [name=" + this.name + ", age=" + this.age
                + ", salary=" + this.salary + "]";
    }

    public static void main(String[] args) {
        NameAgeSalary n1 = new NameAgeSalary("John",30,1000f);
        NameAgeSalary n2 = new NameAgeSalary("Mary",25,2000f);
        NameAgeSalary n3 = new NameAgeSalary("Eric",22,5000f);

        List<NameAgeSalary> list = Arrays.asList(n1,n2,n3);

        Collections.sort(list, new Comparator<NameAgeSalary>() {

            @Override
            public int compare(NameAgeSalary o1, NameAgeSalary o2) {
                /*
                 * uncomment the field you want to compare
                 */
                return o1.age.compareTo(o2.age);
//              return o1.name.compareTo(o2.name);
//              return o1.salary.compareTo(o2.salary);
            }

        });

        System.out.println("MIN "+list.get(0)); //min
        System.out.println("MAX "+list.get(list.size()-1)); //max
    }
}
导入java.util.array;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
公开课名称工资{
私有字符串名称;
私人整数年龄;
私人浮动工资;
私有名称薪资(字符串名称、整数年龄、浮动薪资){
超级();
this.name=名称;
这个。年龄=年龄;
这个。薪水=薪水;
}
@凌驾
公共字符串toString(){
return“NameAgeSalary[name=“+this.name+”,age=“+this.age
+“,salary=“+this.salary+”];
}
公共静态void main(字符串[]args){
NameAgeAlary n1=新的NameAgeAlary(“约翰”,301000F);
NameAgeAlary n2=新NameAgeAlary(“玛丽”,252000F);
NameAgeAlary n3=新的NameAgeAlary(“Eric”,225000F);
列表=数组.asList(n1,n2,n3);
Collections.sort(list,newcomparator(){
@凌驾
公共整数比较(NameAgeAlary o1,NameAgeAlary o2){
/*
*取消对要比较的字段的注释
*/
返回o1.年龄比(o2.年龄);
//返回o1.name.compareTo(o2.name);
//返回o1.薪资。比较(o2.薪资);
}
});
System.out.println(“MIN”+list.get(0));//MIN
System.out.println(“MAX”+list.get(list.size()-1));//MAX
}
}

展示你所做的代码。你能说得更清楚一点吗?你有没有一些你尝试过但没有成功的代码?Java的哪个版本?你能详细说明一下吗。可能会显示一些代码。什么
集合
?什么类型的?显示类型的代码。此时我无法共享代码。我已经重写了compareTo方法,用于按名称对列表进行排序。每个人的数据都是PersonInfo集合中的一个对象[Student@8efb846]请告诉我,我对Java和编程非常陌生。@jdpenix我认为OP在
可选的
@user3837378上调用了
toString
,您需要调用
可选的
来获得结果。正如我所说,如果传入的
集合为空,则调用
get
可能会导致
NoTouchElementException
,您可能需要事先检查。我使用了get,得到的结果是-Student@8efb846@用户3837378这听起来确实是个结果-你还想要什么?有什么问题吗?怎么可能在运行时取消注释?您不能。但是您可以编写3个比较器,并使用一些代码选择正确的比较器
Collections.min(myList, new SalaryComparator());
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class NameAgeSalary {
    private String name;
    private Integer age;
    private Float salary;

    private NameAgeSalary(String name, Integer age, Float salary) {
        super();
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "NameAgeSalary [name=" + this.name + ", age=" + this.age
                + ", salary=" + this.salary + "]";
    }

    public static void main(String[] args) {
        NameAgeSalary n1 = new NameAgeSalary("John",30,1000f);
        NameAgeSalary n2 = new NameAgeSalary("Mary",25,2000f);
        NameAgeSalary n3 = new NameAgeSalary("Eric",22,5000f);

        List<NameAgeSalary> list = Arrays.asList(n1,n2,n3);

        Collections.sort(list, new Comparator<NameAgeSalary>() {

            @Override
            public int compare(NameAgeSalary o1, NameAgeSalary o2) {
                /*
                 * uncomment the field you want to compare
                 */
                return o1.age.compareTo(o2.age);
//              return o1.name.compareTo(o2.name);
//              return o1.salary.compareTo(o2.salary);
            }

        });

        System.out.println("MIN "+list.get(0)); //min
        System.out.println("MAX "+list.get(list.size()-1)); //max
    }
}