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
}
}