Skip to content

Instantly share code, notes, and snippets.

@ihopeudie
Created October 18, 2020 15:08
Show Gist options
  • Save ihopeudie/e6475ced2a6e49736c8cb1070a92d4e5 to your computer and use it in GitHub Desktop.
Save ihopeudie/e6475ced2a6e49736c8cb1070a92d4e5 to your computer and use it in GitHub Desktop.
skillbox company task
package com.example.company;
import com.example.domain.*;
public class Main {
public static void main(String[] args) {
Company company = new Company();
hireEmployees(company);
printHighestSalaries(company);
printLowestSalaries(company);
fireHalfEmployees(company);
printHighestSalaries(company);
printLowestSalaries(company);
}
private static void printLowestSalaries(Company company) {
System.out.println("Самые низкие зарплаты: ");
for (Employee employee : company.getLowestSalaryStaff(15)) {
System.out.println(employee.getMonthSalary());
}
}
private static void printHighestSalaries(Company company) {
System.out.println("Самые высокие зарплаты: ");
for (Employee employee : company.getTopSalaryStaff(15)) {
System.out.println(employee.getMonthSalary());
}
}
private static void fireHalfEmployees(Company company) {
int countEmployees = company.countEmployees();
for (int i = 0; i < countEmployees / 2; i++) {
int index = (int) (Math.random() * company.countEmployees());
Employee loser = company.getEmployees().get(index);
company.fire(loser);
}
System.out.println("Уволено " + countEmployees / 2 + " сотрудников");
}
private static void hireEmployees(Company company) {
for (int i = 0; i < 180; i++) {
Employee operator = new Operator();
company.hire(operator);
}
for (int i = 0; i < 80; i++) {
Employee manager = new Manager();
company.hire(manager);
}
for (int i = 0; i < 10; i++) {
Employee topManager = new TopManager();
company.hire(topManager);
}
System.out.println("Добавлено сотрудников: " + company.countEmployees());
}
}
package com.example.domain;
import java.util.*;
public class Company {
private final List<Employee> employees = new ArrayList<Employee>();
public void hire(Employee employee) {
this.employees.add(employee);
}
public void hireAll(Collection<Employee> employees) {
this.employees.addAll(employees);
}
public void fire(Employee employee) {
employees.remove(employee);
}
public static int getIncome() {
return 15000000;
}
public List<Employee> getTopSalaryStaff(int count) {
return getFilteredLimitedList(count, new Comparator<Employee>() {
public int compare(Employee o1, Employee o2) {
return o2.getMonthSalary() - o1.getMonthSalary();
}
});
}
public List<Employee> getLowestSalaryStaff(int count) {
return getFilteredLimitedList(count, new Comparator<Employee>() {
public int compare(Employee o1, Employee o2) {
return o1.getMonthSalary() - o2.getMonthSalary();
}
});
}
private List<Employee> getFilteredLimitedList(int count, Comparator<Employee> comparator) {
List<Employee> copyList = new ArrayList<Employee>(employees);
Collections.sort(copyList, comparator);
List<Employee> result = new ArrayList<Employee>();
for (int i = 0; i < count; i++) {
result.add(copyList.get(i));
}
return result;
}
public int countEmployees() {
return employees.size();
}
public List<Employee> getEmployees() {
return employees;
}
}
package com.example.domain;
public interface Employee {
public int getMonthSalary();
}
package com.example.domain;
public class Manager implements Employee {
private static final int FIX_SALARY = 50000;
private final int earningsForCompany;
public Manager() {
this.earningsForCompany = (int) (Math.random() * 25000) + 115000;
}
public int getMonthSalary() {
return FIX_SALARY + (int) (earningsForCompany * 0.05);
}
}
package com.example.domain;
public class Operator implements Employee {
private static final int FIX_SALARY = 30000;
public int getMonthSalary() {
return FIX_SALARY;
}
}
package com.example.domain;
public class TopManager implements Employee {
public static int FIX_SALARY = 1500000;
public int getMonthSalary() {
return FIX_SALARY + Company.getIncome() > 10000000 ? (int) (FIX_SALARY * 1.5) : 0;
}
}

Что нужно сделать

  1. Создайте класс компании Company, содержащей сотрудников и реализующей методы: найм одного сотрудника — hire(), найм списка сотрудников – hireAll(), увольнение сотрудника – fire(), получение значения дохода компании – getIncome(). Аргументы и возвращаемое значение методов выберите на основании логики работы вашего приложения.

  2. Создайте два метода, возвращающие список указанной длины (count). Они должны содержать сотрудников, отсортированных по убыванию и возрастанию заработной платы: List getTopSalaryStaff(int count), List getLowestSalaryStaff(int count).

  3. Создайте классы сотрудников с информацией о зарплатах и условиями начисления зарплаты: Manager — зарплата складывается из фиксированной части и бонуса в виде 5% от заработанных для компании денег. Количество заработанных денег для компании генерируйте случайным образом от 115 000 до 140 000 рублей. TopManager — зарплата складывается из фиксированной части и бонуса в виде 150% от заработной платы, если доход компании более 10 млн рублей. Operator — зарплата складывается только из фиксированной части.

Каждый класс сотрудника должен имплементировать интерфейс Employee. В интерфейсе Employee должен быть объявлен метод, возвращающий зарплату сотрудника: getMonthSalary() Аргументы и возвращаемое значение метода выберите в соответствии с логикой начисления зарплат.

Для демонстрации и тестирования работы ваших классов: Создайте и наймите в компанию: 180 операторов Operator, 80 менеджеров по продажам Manager, 10 топ-менеджеров TopManager. Распечатайте список из 10–15 самых высоких зарплат в компании. Распечатайте список из 30 самых низких зарплат в компании. Увольте 50% сотрудников. Распечатайте список из 10–15 самых высоких зарплат в компании. Распечатайте список из 30 самых низких зарплат в компании.

Примеры вывода списка зарплат

Список из пяти зарплат по убыванию: 230 000 руб. 178 000 руб. 165 870 руб. 123 000 руб. 117 900 руб.

Рекомендации

Можно создавать разные экземпляры компании со своим списком сотрудников и доходом. Чтобы получить данные компании внутри класса сотрудника, настройте хранение ссылки на Company и передавайте объект Company с помощью конструктора или сеттера. Учтите, в методы получения списков зарплат могут передаваться значения count, превышающие количество сотрудников в компании, или отрицательные.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment