Как перевести сотрудника для увеличения средних ЗП в отделах?

Задача: перевести сотрудника для увеличения средних ЗП в отделах?

Как планировал: сначала подразумевалось, что достану все заработные платы из Departament. Затем буду работать по такому алгоритму: перевод возможен из отдела с большей средней зп в отдел с меньшей средней зп, нужны сотрудники отдела с большей зп, которые имеют зп в пределах от средней одного отдела до средней второго отдела.

Проблемы: 1. По зп, которую получил - мне ещё нужно достать имя сотрудника, у которого эта заработная плата. 2. Весь механизм работает только при том, когда первый отдел имеет большую зп, для второго не подходит, потому что при сохранении элементов в список, будут записаны также зп первого отдела, а как без них это сделать ещё не разобрался.

public static BigDecimal empswap(Map<String, Department> departments, String key) {
    BigDecimal sal = new BigDecimal(0);
    List<BigDecimal> temp = new ArrayList<BigDecimal>();

    for (Department dep : departments.values()) {
        if (key.equals("Первый отдел имеет большую среднюю зп")) {
            int i = 0;
            // Сохраняю в List данные о зп первого отдела
            dep.getEmployeeList().forEach((c) -> temp.add(c.getSalary()));
            for (BigDecimal number : temp) {
                // Ищу макс. зп, которая находится между двух средних зп по отделам
                if (temp.get(i).compareTo(avgEmp.get(1)) > 0 && temp.get(i).compareTo(avgEmp.get(0)) > 0) {
                    sal = temp.get(i);
                }
                i++;
            }
break;
        }
        if (key.equals("Второй отдел имеет большую среднюю зп")) {
            break;
        }
    }
    return sal;
}

Как хранятся данные в departaments:

Первый - Department{name='Первый', employeeList=[Employee{salary=13000.13, name='Кошкин'}, Employee{salary=13000.18, name='Петрович Котович Кот'}, Employee{salary=20000.0, name='Сидоров'}, Employee{salary=40000.0, name='Пушкин'}]}
Второй - Department{name='Второй', employeeList=[Employee{salary=10000.0, name='Петров'}]}

Средняя зп

public static void avg(Map<String, Departament> departments, List<BigDecimal> avgEmp) {
        for (Departament dep : departments.values()) {
            BigDecimal avg = dep.salaryAvg();
            avgEmp.add(avg);
            System.out.println("Средняя заработная плата отдела " + dep.getName() + ": " + avg);
        }
        systemMessage(1);
    }

public BigDecimal salaryAvg() {
        BigDecimal sum = BigDecimal.ZERO;
        for (Employee employee : employeeList)
            sum = sum.add(employee.getSalary());
        return sum.divide(BigDecimal.valueOf(employeeList.size()));
    }

Ответы (1 шт):

Автор решения: azlov

Давайте по порядку: Как планировал: сначала подразумевалось, что достану все заработные платы из Departament. нет необходимости создавать доп. структуры для хранения ненужной информации она ведь у вас уже есть, работайте с ней.

Для начала нужно найти средний ЗП отделов:

double avgSalaryAtFirstDep = department1.getEmployeeList().stream().mapToDouble(Employee::getSalary).average().orElse(0.0);  // средняя ЗП первого отдела

Потом сравниваем средний ЗП отделов:

List<Employee> employeeList = new ArrayList<>(); // лист, в котором будут храниться сотрудники для перевода
if (avgSalaryAtFirstDep > avgSalaryAtSecondDep) { // если средняя ЗП в первом отделе больше
   employeeList.addAll(
      department1.getEmployeeList().stream() // значит проходим по первому листу и сравниваем
        .filter(emp -> emp.getSalary() > avgSalaryAtSecondDep && emp.getSalary() < avgSalaryAtFirstDep)
        .collect(Collectors.toList()));
 } else if (avgSalaryAtFirstDep < avgSalaryAtSecondDep) {
  // тое самое для второго
   } else { 
    // если равны
     }

И вот на выходе вы получаете лист с сотрудниками, которые могут перейти в другой отдел employeeList

Я решил с помощью стримов, но реально и на циклах.

→ Ссылка