Структура данных и дизайн для объектной модели Java на основе агрегирования данных
Я работаю над упражнением в кодировании, которое меня несколько смущает тем, как реализовать решение.
Согласно JavaDoc, я должен реализовать этот интерфейс EmployeeManager. Предположим, что данные сотрудника поступают в отдельном потоке от других запросов. Обратите внимание, что getSalary() выполняется за постоянное время O(n). Время выполнения не должно меняться в зависимости от количества сотрудников или отделов.
import java.util.List;
/**
* Manage departments and employees to easily query aggregate data.
* All methods should be thread-safe.
*/
public interface EmployeeManager {
/**
* Create a new department with the given name and the given parentId.
* The department name need not be unique.
*
* @param departmentName
* the name of the new department.
* @param parentId
* the parent department or null if no parent
* @return the ID of the newly created department
* @throws RuntimeException
* if the parent department (if not null) does not exist
*/
public int newDepartment(String departmentName, Integer parentDepartmentId);
/**
* Create a new employee with the given ID
* and given parent department (if any).
*
* @param employeeId
* the new employee's ID
* @param parentdepartmentId
* the parent department or null if no parent
* @throws RuntimeException
* if the employee or parent department (if not null) does not exist
*/
public void newEmployee(int employeeId, Integer parentdepartmentId);
/**
* Return a list of department IDs that are
* direct children of the given parent.
*
* Null is a valid value for parent.
*
* @param departmentId
* the parent department ID
* @return a list of child department IDs
* @throws RuntimeException
* if the department does not exist
*/
public List<Integer> getDepartments(Integer departmentId);
/**
* Return a list of employee IDs that are direct children of the given parent.
* Null is a valid value for parent.
*
* @param departmentId
* the parent department ID
* @return a list of child employee IDs
* @throws RuntimeException
* if the department does not exist
*/
public List<Integer> getEmployees(Integer departmentId);
/**
* Move the given department to the new parent.
*
* @param departmentId
* the ID of the department to move
* @param parentDepartmentId
* the new parent. The new parent department
* -- if the id is not null -- must exist, and
* must not create a cyclic graph.
* @throws RuntimeException
* if a cyclic graph would be created or
* the department or parent department does not exist
*/
public void moveDepartment(int departmentId, Integer parentDepartmentId);
/**
* Move the given employee to the new parent.
*
* @param employeeId
* the ID of the employee to move
* @param parentDepartmentId
* the new parent. The new parent department
* -- if the id is not null -- must exist.
* @throws RuntimeException
* if the employee or parent department
* (if not null) does not exist
*/
public void moveEmployee(int employeeId, Integer parentDepartmentId);
/**
* Return the name of the given department.
*
* @param departmentId
* the department ID
* @return the department name
* @throws RuntimeException
* if the department does not exist
*/
public String getName(int departmentId);
/**
* Return the current aggregate salaries of
* all employees in the given department
*
* (including all employees in all child departments).
*
* Must execute in constant time O(n).
*
* @param departmentId
* the department ID
* @return the aggregate salary or return null if no employees
* @throws RuntimeException
* if the department does not exist
*/
public Double getSalary(int departmentId);
/**
* New data has arrived from the given employee.
* If new data arrives for an unknown employee, then
* create this employee with parent department null.
*
* @param employeeId
* the employee ID
* @param salary
* the new salary
* @throws RuntimeException
* if the employee does not exist
*/
public void newEmployeeData(int employeeId, double salary);
}
Вопросы):
Что это за проблема?
Должен ли я создавать классы Employee и Department как POJO и что будет внутри? Придется ли им реализовать runnable, чтобы быть потокобезопасным?
Какой тип структуры данных необходим для этого?
Я действительно разбираюсь в своих структурах данных и материалах CS, поэтому буду очень признателен за любые отзывы.