2016-10-20 4 views
0

Je veux calculer le nombre de niveaux entre le gestionnaire et l'employé. C'est-à-dire, si je donne un empid, je voudrais savoir combien de gestionnaires sont là dans la hiérarchie. Here est un exemple où l'on peut trouver le nombre de rapports directsTrouver le nombre de niveaux hiérarchiques dans java

Mais je veux trouver le niveau hiérarchique emp-mgr.

par ex. emp, mgr

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

Dans cet exemple C est responsable de A, C est également gérant de B, F est gestionnaire de C et ainsi de suite.

F -> A = 3(mgrs between) 

pouvez-vous s'il vous plaît me aider à résoudre ce en utilisant java

+2

On dirait une tâche facile. Avez-vous essayé quelque chose? X = A -> Obtenez le gestionnaire de X jusqu'à X = F. Prenez les chiffres de l'étape précédente. –

+0

Je ne comprends pas votre exemple, aidez-moi s'il vous plaît. Est-ce que A-> C-> D-> E-> F? –

+0

Si nous disons Manager F et Employee A, vous voulez dire que le niveau est de 4 niveaux, y compris F else 3? –

Répondre

0

Je ne dois pas vous donner ce aussi longtemps que vous avez montré aucun effort au-delà de répondre à une question de clarification. Mon idée est que je commence par tous les gestionnaires (C, D, E et F) et compte à quel point je peux grimper l'arbre de gestion d'eux.

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; 
} 

Cette méthode trouve le nombre d'étapes du plus bas employé (feuille dans l'arbre de gestion) au gestionnaire d'auto-gestion (racine), qui est, 4 dans l'exemple (pour une carte vide ou une carte composé uniquement du gestionnaire autogestionnaire, il retournera 0). Soustraire un pour obtenir seulement le nombre de gestionnaires entre:

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); 

Imprime 3.

+0

Jee, étais-ce utile? A moins que vous n'attendiez d'autres réponses, n'hésitez pas à marquer comme accepté (appuyez sur la coche à gauche de la réponse) si vous pensez. –

+0

Merci Ole pour la réponse. Cela m'a aidé à regarder plus d'options. Je dois aussi vérifier d'autres niveaux, par exemple, si le directeur a plus d'employés qui déclarent, comme je l'ai mentionné dans mes commentaires précédents. – Jee