diff --git a/java/com/aa/act/interview/org/Organization.java b/java/com/aa/act/interview/org/Organization.java index e1c8ed1..a3142b5 100644 --- a/java/com/aa/act/interview/org/Organization.java +++ b/java/com/aa/act/interview/org/Organization.java @@ -1,12 +1,17 @@ package com.aa.act.interview.org; +import java.util.HashSet; +import java.util.LinkedList; import java.util.Optional; +import java.util.Queue; public abstract class Organization { private Position root; + private int employeeIdentifier; public Organization() { + employeeIdentifier = 0; root = createOrganization(); } @@ -21,7 +26,10 @@ public Organization() { */ public Optional hire(Name person, String title) { //your code here - return Optional.empty(); + Position hiredPosition = bfsGetPositionPerTitle(title); + hiredPosition.setEmployee(Optional.of(new Employee(++employeeIdentifier, person))); + return Optional.ofNullable(hiredPosition); + //return Optional.empty(); } @Override @@ -36,4 +44,26 @@ private String printOrganization(Position pos, String prefix) { } return sb.toString(); } + + public Position bfsGetPositionPerTitle(String title) { + HashSet visited = new HashSet<>(); + Queue adjacent = new LinkedList<>(); + adjacent.add(root); + + // Loop through all adjacent positions + while (!adjacent.isEmpty()) { + Position current = adjacent.remove(); + if (current.getTitle() == title) { + return current; + } + for (Position position : current.getDirectReports()) { + if (!visited.contains(position)) { + adjacent.add(position); + } + } + visited.add(current); + } + throw new IllegalArgumentException("there is no position with this title"); + + } }