如何使用Java8流在下面的数组列表中找到第二高的薪水[关闭]

问题描述 投票:0回答:2
class Employee
{
    int id;
     
    String name;
     
    int age;
     
    String gender;
     
    String department;
     
    int yearOfJoining;
     
    double salary;
     
    public Employee(int id, String name, int age, String gender, String department, int yearOfJoining, double salary) 
    {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.department = department;
        this.yearOfJoining = yearOfJoining;
        this.salary = salary;
    }
     
    public int getId() 
    {
        return id;
    }
     
    public String getName() 
    {
        return name;
    }
     
    public int getAge() 
    {
        return age;
    }
     
    public String getGender() 
    {
        return gender;
    }
     
    public String getDepartment() 
    {
        return department;
    }
     
    public int getYearOfJoining() 
    {
        return yearOfJoining;
    }
     
    public double getSalary() 
    {
        return salary;
    }
     
    @Override
    public String toString() 
    {
        return "Id : "+id
                +", Name : "+name
                +", age : "+age
                +", Gender : "+gender
                +", Department : "+department
                +", Year Of Joining : "+yearOfJoining
                +", Salary : "+salary;
    }
}

List<Employee> employeeList = new ArrayList<Employee>();
         
employeeList.add(new Employee(111, "Jiya Brein", 32, "Female", "HR", 2011, 25000.0));
employeeList.add(new Employee(122, "Paul Niksui", 25, "Male", "Sales And Marketing", 2015, 13500.0));
employeeList.add(new Employee(133, "Martin Theron", 29, "Male", "Infrastructure", 2012, 18000.0));
employeeList.add(new Employee(144, "Murali Gowda", 28, "Male", "Product Development", 2014, 32500.0));
employeeList.add(new Employee(155, "Nima Roy", 27, "Female", "HR", 2013, 22700.0));

Optional<Employee> emp = employeeList.stream()
        .collect(Collectors.maxBy(Comparator.comparingDouble(Employee::getSalary)));
java java-8
2个回答
12
投票

按照薪资倒序对列表进行排序后,可以用

skip(1)
跳过最高的,然后用
findFirst()
方法找到之后的第一个员工,找到第二高的薪资。

试试这个:

Optional<Employee> emp = employeeList.stream()
        .sorted(Comparator.comparingDouble(Employee::getSalary).reversed()).skip(1).findFirst();

System.out.println(emp.get());

输出:

Id : 111, Name : Jiya Brein, age : 32, Gender : Female, Department : HR, Year Of Joining : 2011, Salary : 25000.0

1
投票

您需要对列表进行排序,然后得到第二个(列表索引从0开始)。

1.

List<Employee> sortedList = employeeList.stream()
.sorted(Comparator.comparingDouble(Employee::getSalary).reversed()).collect(Collectors.toList());
  1. sortedList.get(1)
  2. 如果我们想要按部门分组。
Map<String, Integer> emp = employeeList.stream()
                .collect(Collectors.groupingBy(Employee::getDepartment)).entrySet().stream().collect(Collectors.toMap(entry-> entry.getKey(),
                        entry->entry.getValue().stream().sorted(Comparator.comparingInt(Employee::getSalary).reversed())
                                .skip(1).findFirst().map(Employee::getSalary).orElse(0)));
© www.soinside.com 2019 - 2024. All rights reserved.