2016-10-20 2 views
0

Я хочу рассчитать количество уровней между менеджером и сотрудником.Найти количество уровней структуры отчетности в java

То есть, если я дам empid, я хотел бы знать, сколько менеджеров находится в иерархии. Here - образец, в котором мы можем найти количество прямых отчетов

Но я хочу найти уровень иерархии emp-mgr.

например. EMP, прил

{ "A", "C" }, 
{ "B", "C" }, 
{ "C", "D" }, 
{ "D", "E" }, 
{ "E", "F" }, 
{ "F", "F" } 

В этом примере С менеджером, С также менеджер B, F является менеджером С и так далее.

F -> A = 3(mgrs between) 

Пожалуйста, вы можете мне помочь в решении этого с помощью Java

+2

Кажется легкой задачей. Вы что-то пробовали? X = A -> Получите менеджера X до X = F. Возьмите номера предыдущего шага. –

+0

Я не понимаю ваш пример, пожалуйста, помогите мне. Является ли это A-> C-> D-> E-> F? –

+0

Если мы скажем, менеджер F и сотрудник A вы хотите сказать, что уровень 4 уровня, включая F else 3? –

ответ

0

Я не должен дать вам это, пока вы не показали никаких усилий, помимо ответа на один уточняющий вопрос. Моя идея заключается в том, что я начинаю со всех менеджеров (C, D, E и F) и подсчитываю, насколько я могу подняться из дерева управления из них.

public static <T> int treeHeight(Map<T, T> management) { 
    // find first level managers 
    Collection<T> managers = management.entrySet() 
      .stream() 
      .filter(entry -> ! entry.getKey().equals(entry.getValue())) 
      .map(Map.Entry::getValue) 
      .collect(Collectors.toCollection(HashSet::new)); 
    int level = 0; 
    while (! managers.isEmpty()) { 
     level++; 
     // find next level managers 
     managers = managers.stream() 
       .filter(emp -> ! emp.equals(management.get(emp))) 
       .map(emp -> management.get(emp)) 
       .collect(Collectors.toCollection(HashSet::new)); 
    } 
    return level; 
} 

Этот метод находит количество шагов от самого низкого работника (лист в дереве управления) к самоуправляющегося менеджер (корень), то есть 4 в этом примере (для пустой карты или карты состоящий только из самоуправляющегося менеджера, он вернется 0). Вычтите один, чтобы получить только число менеджеров между:

Map<String, String> management = new HashMap<>(); 
    management.put("A", "C"); 
    management.put("B", "C"); 
    management.put("C", "D"); 
    management.put("D", "E"); 
    management.put("E", "F"); 
    management.put("F", "F"); 
    System.out.println(treeHeight(management) - 1); 

Печатается 3.

+0

Джи, это было полезно? Если вы не ожидаете ответа на другие ответы, не стесняйтесь отмечать как принятые (нажмите галочку слева от ответа), если вы думаете. –

+0

Спасибо Оле за ответ. Это помогло мне найти больше вариантов. Мне также нужно проверить больше уровней, например, если у менеджера больше сотрудников, как я упоминал в своих предыдущих комментариях. – Jee

Смежные вопросы