Структура данных и дизайн для объектной модели 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);
}

Вопросы):

  1. Что это за проблема?

  2. Должен ли я создавать классы Employee и Department как POJO и что будет внутри? Придется ли им реализовать runnable, чтобы быть потокобезопасным?

  3. Какой тип структуры данных необходим для этого?

Я действительно разбираюсь в своих структурах данных и материалах CS, поэтому буду очень признателен за любые отзывы.

0 ответов

Другие вопросы по тегам