Как перевести сотрудника для увеличения средних ЗП в отделах?
Задача: перевести сотрудника для увеличения средних ЗП в отделах?
Как планировал: сначала подразумевалось, что достану все заработные платы из 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 шт):
Давайте по порядку: Как планировал: сначала подразумевалось, что достану все заработные платы из 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
Я решил с помощью стримов, но реально и на циклах.