使用流过滤器比较双精度值

问题描述

我需要你的帮助来确定我现在正在处理的代码有什么问题。

此任务的规范是过滤从 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]]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...