问题描述
我需要你的帮助来确定我现在正在处理的代码有什么问题。
此任务的规范是过滤从 csv 文件中获取的对象列表,只获取工资最高的前 10 名员工。我正在尝试这些行:
List<Employee> listOfTop10HighestPaidMaleEmployee = new ArrayList<>(employeeList);
List<Employee> filterSalary;
filterSalary = listOfTop10HighestPaidMaleEmployee
.stream()
.sorted(
Comparator.comparingDouble(Employee::getSalary)
)
.limit(10)
.collect(Collectors.toList());
当我使用 for-each 循环测试它时,它打印出 10 个值,但没有正确过滤掉工资部分。我得到这个输出:
Employee{id='261461',name='Lucila Isai Gray Silvestre',department='Software Development Team',gender=M,age=34,employment status=Permanent,salary=20079.75,years of service=9}
Employee{id='368487',name='Joey Quinn Uson Solivio',department='Marketing',employment status=Not Permanent,salary=20200.25,years of service=3}
Employee{id='353810',name='Carter Jamie Pagsisihan Lingao',age=24,salary=20444.25,years of service=4}
Employee{id='330680',name='Erick Colby Magan Formalouza',department='IT Services',age=52,salary=20887.0,years of service=14}
Employee{id='220888',name='Jack Cornelius Parker Guinto',age=32,salary=20950.0,years of service=10}
Employee{id='215350',name='Eugenio Jermaine Quiblat Bonachita',age=45,salary=21263.5,years of service=2}
Employee{id='257430',name='Malaya Kaitlyn Hakamada Gonz�lez',gender=F,age=35,salary=21362.0,years of service=2}
Employee{id='212292',name='Kendra Mercedes Lomondot Fernando',a
age=41,salary=21371.75,years of service=3}
Employee{id='348771',name='Kristofer Israel Dura Portugal',department='Human Resource',age=49,salary=21402.5,years of service=6}
Employee{id='353227',name='Maegan Jaden Mahiya Isidro',age=59,salary=21442.25,years of service=3}
在对结果和列表进行交叉检查后,它会打印出工资范围为 20000-21,000 的列表。在原来的名单中,薪水高达30,000。关于如何过滤列表以显示薪水最高的 10 名员工的列表的任何提示?任何帮助将不胜感激。提前致谢!
解决方法
已解决:
添加了 .reversed() 行,
listOfTop10HighestPaidMaleEmployee = listOfTop10HighestPaidMaleEmployee
.stream()
.sorted(Comparator.comparingDouble(Employee::getSalary).reversed())
.limit(10)
.collect(Collectors.toList());
这将获取按降序排序的列表的最后 10 个。
这是一个完整的例子。为简洁起见,使用新的 Java 16 record 功能。
record Employee(String name,double salary) {}
List < Employee > employees =
List.of(
new Employee( "Alice",88 ),// # 1
new Employee( "Bob",52 ),// # 3
new Employee( "Carol",33 ),new Employee( "Dennis",22 ),new Employee( "Ellen",77 ),// # 2
new Employee( "Francis",17 )
);
List < Employee > highestPaid =
employees
.stream()
.sorted(
Comparator.comparingDouble( Employee :: salary ).reversed()
)
.limit( 3 )
.collect( Collectors.toList() ); // Or just `.toList()` in Java 16+.
System.out.println( "highestPaid = " + highestPaid );
运行时。
highestPaid = [员工[姓名=爱丽丝,薪水=88.0],员工[姓名=艾伦,薪水=77.0],员工[姓名=鲍勃,薪水=52.0]]