Java группировка потоков По ключу как максимальная зарплата сотруднику и значению как все сотрудники отдела - PullRequest
5 голосов
/ 26 мая 2020

У меня есть список Employee

public class Employee {
  private String name;
  private Integer age;
  private Double salary;
  private Department department;
}

List<Employee> employeeList = Arrays.asList(
      new Employee("Tom Jones", 45, 12000.00,Department.MARKETING),
      new Employee("Harry Major", 26, 20000.00, Department.LEGAL),
      new Employee("Ethan Hardy", 65, 30000.00, Department.LEGAL),
      new Employee("Nancy Smith", 22, 15000.00, Department.MARKETING),
      new Employee("Catherine Jones", 21, 18000.00, Department.HR),
      new Employee("James Elliot", 58, 24000.00, Department.OPERATIONS),
      new Employee("Frank Anthony", 55, 32000.00, Department.MARKETING),
      new Employee("Michael Reeves", 40, 45000.00, Department.OPERATIONS));

Я хочу получить Map<Employee, List<Employee>>, где ключ карты соответствует максимальной заработной плате каждого сотрудника отдела, а значение - всем сотрудникам этого отдела. Я пытаюсь группировать по, но это дает всем сотрудникам с картой отдела. Как получить всех сотрудников с максимальной заработной платой в качестве ключа карты?

Map<Department,List<Employee>> employeeMap
        = employeeList.stream().collect(Collectors.groupingBy(Employee::getDepartment));

Ответы [ 3 ]

2 голосов
/ 26 мая 2020

Кажется, это работает.

  • Сначала он определяет сотрудников по отделам, затем
  • Затем группирует их на основе наибольшей зарплаты сотрудника отделов
Map<Employee, List<Employee>> map = employeeList.stream()
        .collect(Collectors.groupingBy(Employee::getDepartment))
        .entrySet().stream()
        .collect(Collectors.toMap(
                e->e.getValue().stream()
                        .max(Comparator.comparing(
                                Employee::getSalary))
                        .get(),
                Entry::getValue));

Переопределение toString в Employee классе для возврата имени, зарплаты и отдела, вот результат.

map.forEach((k,v)->{System.out.println(k);
    for (Employee e: v) {
          System.out.printf("    %s%n", e);
    }
    System.out.println();
});

Выводит

Frank Anthony, 32000.0, MARKETING}
    {Tom Jones, 12000.0, MARKETING}
    {Nancy Smith, 15000.0, MARKETING}
    {Frank Anthony, 32000.0, MARKETING}

{Michael Reeves, 45000.0, OPERATIONS}
    {James Elliot, 24000.0, OPERATIONS}
    {Michael Reeves, 45000.0, OPERATIONS}

{Catherine Jones, 18000.0, HR}
    {Catherine Jones, 18000.0, HR}

{Ethan Hardy, 30000.0, LEGAL}
    {Harry Major, 20000.0, LEGAL}
    {Ethan Hardy, 30000.0, LEGAL}

2 голосов
/ 26 мая 2020

Вы можете получить требуемый результат следующим образом:

Map<Employee, List<Employee>> result = employees.stream()
         .sorted(Comparator.comparingDouble(Employee::getSalary).reversed())
         .collect(groupingBy(Employee::getDepartment, LinkedHashMap::new, toList())).values().stream()
         .collect(toMap(l -> l.get(0), Function.identity()));

Вероятно, есть лучшие и более эффективные решения, и я бы исчерпал эти идеи, если бы не был на моем телефоне.

1 голос
/ 26 мая 2020

Вы можете сделать это:

Map<Employee, List<Employee>> employeeMap = employeeList.stream()
      .collect(groupingBy(Employee::getDepartment))
      .values().stream()
      .collect(
        groupingBy(
            (es) -> es.stream()
              .max(Comparator.comparing(e -> e.getSalary())).get()
        )
      ).entrySet().stream()
      .collect(toMap(
        Map.Entry::getKey,
        e -> e.getValue().iterator().next()
      ));

Вывод:

{(Michael Reeves, 40, 45000.0, OPERATIONS)=[(James Elliot, 58, 24000.0, OPERATIONS), (Michael Reeves, 40, 45000.0, OPERATIONS)], 
(Catherine Jones, 21, 18000.0, HR)=[(Catherine Jones, 21, 18000.0, HR)], 
(Ethan Hardy, 65, 30000.0, LEGAL)=[(Harry Major, 26, 20000.0, LEGAL), (Ethan Hardy, 65, 30000.0, LEGAL)], 
(Frank Anthony, 55, 32000.0, MARKETING)=[(Tom Jones, 45, 12000.0, MARKETING), (Nancy Smith, 22, 15000.0, MARKETING), (Frank Anthony, 55, 32000.0, MARKETING)]}

Ссылка на repl.it: https://repl.it/repls/CluelessAwesomeLevel#Main. java

...